Enumerar instancias de SQL Server (ADO.NET)

SQL Server 2000 y SQL Server 2005 permiten que las aplicaciones busquen instancias de SQL Server en la red actual. La clase SqlDataSourceEnumerator expone esta información para el programador de la aplicación, suministrando una DataTable que contiene información acerca de todos los servidores visibles. Esta tabla devuelta contiene una lista con las instancias de servidor disponibles en la red que coincide con la lista proporcionada cuando un usuario intenta crear una nueva conexión, y expande la lista desplegable que contiene todos los servidores disponibles en el cuadro de diálogo Propiedades de conexión. Los resultados mostrados no siempre están completos.

NotaNota

Como sucede con la mayoría de servicios de Windows, es mejor ejecutar el servicio de explorador de SQL con los menos privilegios posibles.Para obtener más información acerca de este servicio y cómo administrar su comportamiento, vea los Libros en pantalla de SQL Server.

Recuperación de una instancia de enumeración

Para recuperar la tabla que contiene información acerca de las instancias de SQL Server disponibles, primero debe recuperar un enumerador mediante la propiedad Instance compartida o estática:

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

Una vez que haya recuperado la instancia estática, puede llamar al método GetDataSources, que devuelve una DataTable que contiene información acerca de los servidores disponibles:

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

La tabla que devuelve la llamada al método contiene las siguientes columnas, cada una de las cuales incluye valores string:

Columna

Descripción

ServerName

Nombre del servidor.

InstanceName

Nombre de la instancia del servidor. Si el servidor se ejecuta como instancia predeterminada, esta columna se muestra en blanco.

IsClustered

Indica si el servidor forma parte de un clúster.

Version

Versión del servidor (8.00.x para SQL Server 2000 y 9.00.x para SQL Server 2005).

Limitaciones de la enumeración

Es posible que en la lista no aparezcan todos los servidores disponibles. La lista puede variar dependiendo de algunos factores, como los tiempos de espera o el tráfico de la red. Como consecuencia, la lista puede ser diferente en dos llamadas consecutivas. Solo aparecerán en la lista los servidores de la misma red. Normalmente, los paquetes de difusión no recorren los enrutadores; este es el motivo de que a lo mejor no pueda ver uno de los servidores que aparecen en la lista, aunque se mantenga estable entre llamadas.

Los servidores de la lista pueden tener o no información adicional como IsClustered y la versión. Todo depende de cómo se haya obtenido la lista. Los servidores que aparecen en la lista a través del servicio de explorador de SQL Server tendrán más detalles que los que se encuentran a través de la infraestructura de Windows, que solo muestra el nombre.

NotaNota

La enumeración de servidores solo se encuentra disponible cuando se ejecuta con plena confianza.Los ensamblados que se ejecutan en un entorno de confianza parcial no podrán utilizarla, aunque dispongan del permiso de seguridad de acceso del código (CAS) SqlClientPermission.

SQL Server 2000 proporciona información del SqlDataSourceEnumerator a nivel interno. SQL Server 2005, sin embargo, lo hace mediante el uso de un servicio externo llamado Explorador de SQL. Este servicio está habilitado de forma predeterminada, pero los administradores pueden desactivarlo o deshabilitarlo, para que la instancia del servidor sea invisible para esta clase. Este servicio solo se aplica a SQL Server 2005 y no tiene efecto alguno en el comportamiento de SQL Server 2000.

NotaNota

El hardware o el software puede limitar la capacidad para buscar instancias de SQL Server.Para obtener más información acerca de la apertura de puertos para la búsqueda, vea el artículo de Knowledge Base Cómo utilizar un script con el fin de abrir puertos para SQL Server mediante programación para utilizarlos en sistemas que ejecutan Windows XP Service Pack 2.

Ejemplo

La siguiente aplicación de consola recupera información acerca de todas las instancias de SQL Server visibles y muestra esta información en la ventana de la consola.

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

Vea también

Otros recursos

SQL Server y ADO.NET