枚举 SQL Server 的实例 (ADO.NET)

SQL Server 2000 和 SQL Server 2005 均允许应用程序在当前的网络中查找 SQL Server 实例。 SqlDataSourceEnumerator 类向应用程序开发人员公开此信息,提供包含所有可见服务器的信息的 DataTable。 此返回的表包含网络上可用服务器实例的列表(该列表与用户尝试创建新连接时提供的列表匹配),并展开“连接属性”对话框上包含所有可用服务器的下拉列表。 显示的结果并非总是完整的。

注意注意

与大多数 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

指示服务器是否属于群集。

Version

服务器的版本(对于 SQL Server 2000,为 8.00.x,对于 SQL Server 2005,为 9.00.x)。

枚举限制

所有可用服务器可能会列出,也可能不会列出。 根据超时和网络通信量等因素,列表可能会有所不同。 这可能会使两个连续调用生成不同的列表。 只会列出相同网络上的服务器。 广播包通常不会遍历路由器,这也就是可能会看不到某个服务器列出的原因,但是在各个调用之间是稳定的。

列出的服务器可能包含其他信息,也可能不包含其他信息,例如 IsClustered 和版本。 这取决于获取列表的方式。 通过 SQL Server 浏览器服务列出的服务器将比通过 Windows 基础结构发现的服务器更加详细,后者只会列出名称。

注意注意

只有以完全信任模式运行时,才可以使用服务器枚举。在部分信任的环境中运行的程序集将无法使用服务器枚举,即使这些程序集具有 SqlClientPermission 代码访问安全性 (CAS) 权限。

SQL Server 2000 在内部为 SqlDataSourceEnumerator 提供信息。 但是,SQL Server 2005 通过使用名为 SQL 浏览器的外部 Windows 服务提供信息。 默认情况下启用此服务,但是管理员可以关闭或禁用此服务,使服务器实例对此类是不可见的。 此服务仅适用于 SQL Server 2005,对 SQL Server 2000 的行为没有影响。

注意注意

硬件或软件可能会限制 SQL Server 实例的浏览能力。有关打开端口以进行浏览的更多信息,请参见知识库文章 How to use a script to programmatically open ports for SQL Server to use on systems that are running Windows XP Service Pack 2(如何使用脚本以编程方式打开端口供 SQL Server 在运行 Windows XP Service Pack 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