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

Обновлен: November 2007

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

a6t1z9x2.alert_note(ru-ru,VS.90).gifПримечание.

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

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

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

Dim instance As System.Data.Sql.SqlDatSourceEnumerator = _
   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:

Столбец

Описание

ServerName

Имя сервера.

InstanceName

Имя экземпляра сервера. Является пустым, если сервер работает в качестве экземпляра по умолчанию.

IsClustered

Показывает, является ли сервер частью кластера.

Версия

Версия сервера (8.00.x для SQL Server 2000 и 9.00.x для SQL Server 2005).

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

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

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

a6t1z9x2.alert_note(ru-ru,VS.90).gifПримечание.

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

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

a6t1z9x2.alert_note(ru-ru,VS.90).gifПримечание.

Оборудование и программное обеспечение могут налагать свои ограничения на возможность поиска экземпляров SQL Server. Дополнительные сведения об открытии портов для поиска см. в статье базы знаний Как использовать сценарий для открытия программным путем портов в целях применения SQL Server в системах, работающих под управлением Windows XP с пакетом обновлений 2.

Пример

Следующее приложение командной строки получает сведения обо всех видимых экземплярах 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("============================");
    }
  }
}

См. также

Другие ресурсы

SQL Server и ADO.NET