Dies scheint eine ziemlich häufige Frage zu sein, aber keine der Antworten, die ich gesehen habe, war besonders zufriedenstellend. Ich möchte eine Liste der Namen der MS SQL Server-Instanzen erhalten, die auf dem lokalen Rechner installiert sind, unabhängig davon, ob sie gestartet wurden oder nicht. Für die Zwecke dieser Diskussion ist es OK, nur Instanzen von SQL 2005 und neuer zu finden. Ich kann 2000 und früher mit "Legacy" -Methoden umgehen (d. H. In der Registrierung suchen). Was ich benötige, ist, dass es nicht vom SQL Server-Browserdienst abhängig ist (es ist heutzutage standardmäßig deaktiviert) und dass 64-Bit-Instanzen zurückgegeben werden, selbst wenn die App 32-Bit ist.Wie bekomme ich eine Liste aller MS SQL Server-Instanzen auf dem lokalen Rechner?
Vorschläge die ich gesehen habe:
Dig durch die Registrierung: Angeblich soll Not recommended aufgrund der Registrierungseinträge nicht dokumentiert sind; MS könnte sie in Zukunft ändern. Noch wichtiger ist, soweit ich das beurteilen kann, gehen 64-Bit-Instanzen von MSSQL in die 64-Bit-HKLM \ SOFTWARE \ Microsoft \ Microsoft SQL Server InstalledInstances und 32-Bit-Instanzen in die 32-Bit-Instanzen, also eine 32-Bit-Instanz. Bit App wird keine 64-Bit-Instanzen sehen.
Verwenden Sie die SQL WMI Provider for Configuration Management, die im vorherigen Blogpost erwähnt wurde. Dies scheint der nächste zu sein, aber trotz der Ermahnung des Autors, die Registrierung nicht zu verwenden, da sich die WMI-Namespaces zwischen SQL 2005 und 2008 ändern könnten: 2005 ist es root \ Microsoft \ SqlServer \ ComputerManagement, aber 2008 Es ist root \ Microsoft \ SqlServer \ ComputerManagement10. Wird es sich in Zukunft noch ändern? Das heißt, es ist wahrscheinlich kein großes Problem, wenn ich meine App für eine zukünftige Version von SQL aktualisieren muss.
Das Problem, das ich mit der WMI-Methode habe, ist, dass die SqlService-Klasse eine Liste der Dienstnamen zurückgibt, während ich die Instanz Namen möchte. ZB anstelle von MSSQL $ INSTANCE möchte ich einfach INSTANCE. Das Entfernen von "MSSQL $" ist trivial, ebenso wie die Behandlung des Spezialfalls der Standardinstanz, aber ist es zuverlässig? AFAIK, gibt es technisch keinen Grund, warum der Dienst nicht umbenannt werden konnte, während der Instanzname gleich bleibt. Abgesehen davon, dass jemand eine bessere Methode hat, denke ich, werde ich damit gehen (holen Sie sich die Service-Namen und entfernen Sie die MSSQL $). Die ServerSettings-Klasse gibt den Instanznamen zurück, aber es wird keine 64-Bit-Instanz von SQL 2008 R2 Express angezeigt, die ich auf meinem Computer installiert habe.
Verwenden Sie
SmoApplication.EnumAvailableSqlServers(true)
: Dies scheint auf den SQL Server-Browser-Dienst zu beruhen. Es funktioniert gut, wenn der Browser-Dienst gestartet wird, aber wenn nicht, erhalte ich nur eine Zeile mit dem Computernamen als Servernamen und einem leeren Instanznamen.Verwenden Sie
System.Data.Sql.SqlDataSourceEnumerator.GetDataSources()
: das gleiche Problem, dass es vom SQL Server-Browser abhängt.
Also, gibt es einige andere Methoden, die besser funktionieren könnten?
Beachten Sie, dass unter Windows Server 2012 und Windows 8 die Verwendung von WMI zum Erkennen von Instanzen von SQL Server 2008 R2 fehlschlagen kann, wenn es nicht auf Service Pack 2 aktualisiert wird (SQL Server 2008 R2 10.50.4000, Service Pack 2) . Es schlägt in Modul svrenumapi100.dll, verwendet von wmiprvse.exe – demp