Enumerar instancias de SQL Server (ADO.NET)

SQL Server permite que las aplicaciones busquen instancias de SQL Server en la red actual. La clase SqlDataSourceEnumerator expone esta información al desarrollador de la aplicación y proporciona un DataTable que contiene información sobre todos los servidores visibles. Esta tabla devuelta contiene una lista de las instancias de servidor disponibles en la red que coincide con la lista proporcionada cuando un usuario intenta crear una nueva conexión y amplía 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.

Nota

Al igual que con la mayoría de los servicios de Windows, es mejor ejecutar el servicio SQL Browser con la cantidad mínima de privilegios posible.

Recuperación de una instancia de enumeración

Para recuperar la tabla que contiene información sobre 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.SqlDataSourceEnumerator = _  
   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 un valor DataTable que contiene información sobre los servidores disponibles:

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

La tabla devuelta por la llamada al método contiene las columnas siguientes, todas las cuales contienen valores string:

Columna Descripción
ServerName Nombre del servidor.
InstanceName Nombre de instancia del servidor. En blanco si el servidor se ejecuta como la instancia predeterminada.
IsClustered Indica si el servidor forma o no parte de un clúster.
Versión Versión del servidor. Por ejemplo:

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

Limitaciones de la enumeración

Todos los servidores disponibles pueden o no aparecer en una lista. La lista puede variar en función de factores como los tiempos de espera y el tráfico de red. Esto puede hacer que la lista sea diferente en dos llamadas consecutivas. Solo se mostrarán los servidores de la misma red. Los paquetes de difusión no suelen atravesar los enrutadores, por lo que es posible que no vea un servidor en la lista, aunque estará estable en todas las llamadas.

Los servidores listados pueden tener o no información adicional, como IsClustered y versión. Esto depende de la forma en que se obtuvo la lista. Los servidores que aparecen en la lista del servicio de explorador de SQL Server tienen más detalles que los que se encuentran a través de la infraestructura de Windows, que solo muestran el nombre.

Nota

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

SQL Server proporciona información para SqlDataSourceEnumerator mediante el uso de un servicio externo de Windows denominado SQL Browser. Este servicio está habilitado de forma predeterminada, pero los administradores pueden desactivarlo o deshabilitarlo, lo que hace que la instancia del servidor sea invisible para esta clase.

Ejemplo

La siguiente aplicación de consola recupera información sobre todas las instancias visibles de SQL Server y muestra esa información en la ventana 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("============================");  
    }  
  }  
}  

Consulte también