Поделиться через


Перечисление экземпляров SQL Server (ADO.NET)

SQL Server позволяет приложениям находить экземпляры SQL Server в текущей сети. Класс SqlDataSourceEnumerator предоставляет эти сведения разработчику приложений, предоставляя DataTable сведения обо всех видимых серверах. Эта возвращаемая таблица содержит список экземпляров сервера, доступных в сети, которая соответствует списку, предоставленному при попытке пользователя создать новое подключение, и расширяет раскрывающийся список, содержащий все доступные серверы в диалоговом окне "Свойства подключения ". Отображаемые результаты не всегда завершены.

Замечание

Как и в большинстве служб Windows, лучше всего запустить службу браузера SQL с минимальными привилегиями.

Получение экземпляра перечислителя

Чтобы получить таблицу, содержащую сведения о доступных экземплярах SQL Server, необходимо сначала получить перечислитель с помощью общего/статического Instance свойства:

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

После того, как вы получите статический экземпляр, вы сможете вызвать метод GetDataSources, который возвращает DataTable со сведениями о доступных серверах.

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

Таблица, возвращаемая из вызова метода, содержит следующие столбцы, все из которых содержат string значения:

колонна Описание
Имя сервера Имя сервера.
Имя экземпляра Имя экземпляра сервера. Пусто, если сервер работает как типовой экземпляр.
IsClustered Указывает, является ли сервер частью кластера.
Версия Версия сервера. Рассмотрим пример.

— 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)

Ограничения перечисления

Все доступные серверы могут быть перечислены или нет. Список может отличаться в зависимости от таких факторов, как время ожидания и сетевой трафик. Это может привести к тому, что список будет разным при двух последовательных вызовах. Будут перечислены только серверы в той же сети. Широковещательные пакеты обычно не будут проходить по маршрутизаторам, поэтому вы не увидите указанный сервер, но он будет стабильным в разных вызовах.

Перечисленные серверы могут или не имеют дополнительных сведений, таких как IsClustered и версия. Это зависит от того, как был получен список. Серверы, перечисленные в службе браузера SQL Server, будут иметь больше сведений, чем те, которые найдены через инфраструктуру Windows, которая будет содержать только имя.

Замечание

Перечисление сервера доступно только при запуске в режиме полного доверия. Сборки, работающие в частично доверенной среде, не смогут его использовать, даже если у них есть разрешение SqlClientPermission на безопасность доступа к коду (CAS).

SQL Server предоставляет сведения для SqlDataSourceEnumerator через использование внешней службы Windows с именем SQL Browser. Эта служба включена по умолчанию, но администраторы могут выключить или деактивировать её, что делает серверный экземпляр невидимым для этого класса.

Пример

Следующее консольное приложение извлекает сведения обо всех видимых экземплярах SQL Server и отображает сведения в окне консоли.

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("============================");  
    }  
  }  
}  

См. также