Con la plataforma .NET 2.0 es muy fácil obtener una lista con los servidores SQL Server que están disponibles en nuestra red. Antes era muy complicado porque había que recurrir COM Interop y a ODBC para poder hacer uso de las poco conocidas funciones disponibles para ello (vea por ejemplo este artículo en CodeProject).

Ahora es muy fácil, pues basta con usar la nueva clase SqlDataSourceEnumerator. Este enumerador dispone de un método llamado GetDataSources que devuelve una tabla con los datos de las instancias de SQL Server detectadas en la red local. La tabla dispone de cuatro campos (o columnas) que son los siguientes:

  • ServerName: el nombre del servidor SQL
  • InstanceName: el nombre de la instancia detectada.
  • Version: el número de versión de la instancia detectada.
  • IsClustered: indica si el servidor detectado forma parte de algún cluster.

Un ejemplo de uso sería el siguiente:

            SqlDataSourceEnumerator Descubridor_de_sql = SqlDataSourceEnumerator.Instance;
            DataTable sqls = Descubridor_de_sql.GetDataSources();
            foreach (DataRow servSQL in sqls.Rows)
            {
                Console.WriteLine("///////////////////////////////////////////////////////////");
                Console.WriteLine("Nombre del servidor:" + servSQL["ServerName"]);
                Console.WriteLine("Nombre de la instancia:" + servSQL["InstanceName"]);
                Console.WriteLine("Versión:" + servSQL["Version"]);
                Console.WriteLine("¿Está en cluster?:" + servSQL["IsClustered"]);
            }

El resultado del código anterior en mi máquina es el siguiente:

///////////////////////////////////////////////////////////
Nombre del servidor:TABLETPC
Nombre de la instancia:
Versión:8.00.194
¿Está en cluster?:No
///////////////////////////////////////////////////////////
Nombre del servidor:TABLETPC
Nombre de la instancia:SQLEXPRESS
Versión:9.00.1116
¿Está en cluster?:No

Para utilizar el enumerador en lugar e crear una nueva instancia de la clase SqlDataSourceEnumerator, se debe usar su propiedad estática Instance que devuelve una instancia del enumerador. Esto es así ya que la clase carece de un constructor (se instancia internamente).

Puede que no descubra todos los servidores cercanos (dependerá de los cortafuegos que haya por el medio. De hecho, en mi equipo con Windows XP Service Pack a menos que desconecte el cortafuegos (o permita el uso del puerto 1443) no es capaz de descubir los dos servidores locales que tengo (un SQL Server 2000 y un 2005), así que ojo porque su utilidad puede ser limitada en ciertos entornos, si bien seguramente servirá bien para aplicaciones empresariales.

💪🏻 ¿Este post te ha ayudado?, ¿has aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor