Freigeben über


Aufzählen von Instanzen von SQL Server (ADO.NET)

SQL Server ermöglicht es Anwendungen, SQL Server-Instanzen im aktuellen Netzwerk zu finden. Die SqlDataSourceEnumerator-Klasse stellt diese Informationen dem Anwendungsentwickler zur Verfügung, wobei eine DataTable Informationen zu allen sichtbaren Servern enthält. Diese zurückgegebene Tabelle enthält eine Liste der im Netzwerk verfügbaren Serverinstanzen, die mit der Liste übereinstimmen, die bereitgestellt wird, wenn ein Benutzer versucht, eine neue Verbindung zu erstellen, und erweitert dabei die Dropdownliste mit allen verfügbaren Servern im Dialogfeld Verbindungseigenschaften. Die angezeigten Ergebnisse sind nicht immer vollständig.

Hinweis

Wie bei den meisten Windows-Diensten ist es am besten, den SQL-Browser-Dienst mit den geringstmöglichen Rechten auszuführen.

Das Abrufen einer Enumerator-Instanz

Damit Sie die Tabelle mit den Informationen zu den verfügbaren SQL Server-Instanzen abrufen können, müssen Sie zunächst einen Enumerator abrufen. Hierzu verwenden Sie die freigegebene/statische Instance-Eigenschaft:

Dim instance As System.Data.Sql.SqlDataSourceEnumerator = _
   System.Data.Sql.SqlDataSourceEnumerator.Instance
System.Data.Sql.SqlDataSourceEnumerator instance =
   System.Data.Sql.SqlDataSourceEnumerator.Instance

Sobald Sie die statische Instanz abgerufen haben, können Sie die GetDataSources-Methode aufrufen, die eine DataTable mit Informationen zu den verfügbaren Servern zurückgibt:

Dim dataTable As System.Data.DataTable = instance.GetDataSources()
System.Data.DataTable dataTable = instance.GetDataSources();

Die vom Methodenaufruf zurückgegebene Tabelle enthält die folgenden Spalten, die allesamt string-Werte enthalten:

Kolumne BESCHREIBUNG
ServerName Name des Servers.
InstanceName Name der Serverinstanz. Leer, wenn der Server als Standardinstanz ausgeführt wird.
IsClustered Gibt ab, ob die Serverinstanz zu einem Cluster gehört.
Version Die Version des Servers. Beispiel:

- 9.00.x (SQL Server 2005)
- 10.0.xx (SQL Server 2008)
- 10.50.x (SQL Server 2008 R2)
- 11.0.xx (SQL Server 2012)

Enumerationseinschränkungen

Es kann sein, dass alle verfügbaren Server aufgelistet werden oder nicht. Die Liste kann je nach Faktoren wie Zeitlimits und Netzwerkdatenverkehr variieren. Dies kann dazu führen, dass die Liste bei zwei aufeinander folgenden Aufrufen unterschiedlich ist. Nur Server im selben Netzwerk werden aufgelistet. Übertragungspakete durchlaufen normalerweise keine Router, weshalb ein Server zwar ggf. nicht aufgelistet wird, aber aufrufübergreifend stabil bleibt.

Aufgelistete Server können zusätzliche Informationen wie IsClustered und die Version enthalten oder auch nicht. Dies hängt davon ab, wie die Liste abgerufen wurde. Es werden ausführlichere Informationen angezeigt, wenn die Server über den SQL Server-Browserdienst aufgelistet werden. Bei Servern, die über die Windows-Infrastruktur ermittelt werden, wird nur der Name aufgeführt.

Hinweis

Die Serverenumeration ist nur verfügbar, wenn sie im vollständig vertrauenswürdigen Modus ausgeführt wird. Assemblys, die in einer teilweise vertrauenswürdigen Umgebung ausgeführt werden, können es nicht nutzen, selbst wenn sie die CAS-Berechtigung (Code Access Security) SqlClientPermission haben.

SQL Server stellt Informationen für SqlDataSourceEnumerator mithilfe eines externen Windows-Diensts namens SQL-Browser bereit. Dieser Dienst ist standardmäßig aktiviert. Administratoren können ihn jedoch deaktivieren, sodass die Serverinstanz für diese Klasse nicht sichtbar ist.

Beispiel

Die folgende Konsolenanwendung ruft Informationen zu allen sichtbaren SQL Server-Instanzen ab und zeigt die Informationen im Konsolenfenster an.

Imports System.Data.Sql

Module Module1
  Sub Main()
    ' Retrieve the enumerator instance and then the data.
    Dim instance As SqlDataSourceEnumerator = _
     SqlDataSourceEnumerator.Instance
    Dim table As System.Data.DataTable = instance.GetDataSources()

    ' Display the contents of the table.
    DisplayData(table)

    Console.WriteLine("Press any key to continue.")
    Console.ReadKey()
  End Sub

  Private Sub DisplayData(ByVal table As DataTable)
    For Each row As DataRow In table.Rows
      For Each col As DataColumn In table.Columns
        Console.WriteLine("{0} = {1}", col.ColumnName, row(col))
      Next
      Console.WriteLine("============================")
    Next
  End Sub
End Module
using System.Data.Sql;

class Program
{
  static void Main()
  {
    // Retrieve the enumerator instance and then the data.
    SqlDataSourceEnumerator instance =
      SqlDataSourceEnumerator.Instance;
    System.Data.DataTable table = instance.GetDataSources();

    // Display the contents of the table.
    DisplayData(table);

    Console.WriteLine("Press any key to continue.");
    Console.ReadKey();
  }

  private static void DisplayData(System.Data.DataTable table)
  {
    foreach (System.Data.DataRow row in table.Rows)
    {
      foreach (System.Data.DataColumn col in table.Columns)
      {
        Console.WriteLine("{0} = {1}", col.ColumnName, row[col]);
      }
      Console.WriteLine("============================");
    }
  }
}

Siehe auch