¿Cómo enumerar las instancias disponibles de Servidores SQL usando SMO en C #?

¿Alguien puede explicarme qué mal estoy haciendo en el siguiente código:

DataTable dt=SmoApplication.EnumAvailableSqlServer(true); Server sr = new Server("Test"); foreach(DataBase db in sr.DataBases) { Console.WriteLine(db["name"]); } 

Da una excepción en sr.Databases que no se pueden conectar.

Eche un vistazo a los siguientes enlaces que pueden ser útiles:

  • Enumerar instancias de SQL Server en C #, utilizando ODBC
  • Cómo obtener una lista de servidores SQL disponibles usando C # (MSDN)
  • Llenar una lista de servidores SQL

Alternativamente, puedes cambiar tu código a este:

 DataTable dt = SmoApplication.EnumAvailableSqlServers(false); if (dt.Rows.Count > 0) { foreach (DataRow dr in dt.Rows) { Console.WriteLine(dr["Name"]); } } 

Espero que esto resuelva tu problema.

¿Tienes un servidor SQL con el nombre de instancia Test ? Si no, ese es tu problema.

Parece que está intentando enumerar todas las instancias locales de SQL Server. Si es así, este código funcionará:

 DataTable dt = SmoApplication.EnumAvailableSqlServers(true); foreach (DataRow dr in dt.Rows) { Console.WriteLine(dr["Name"]); Console.WriteLine(" " + dr["Server"]); Console.WriteLine(" " + dr["Instance"]); Console.WriteLine(" " + dr["Version"]); Console.WriteLine(" " + dr["IsLocal"]); } 

En caso de que la pregunta tenga un título incorrecto, es decir, que quiera encontrar las bases de datos en la instancia particular:

 using System; using Microsoft.SqlServer.Management.Smo; using System.Data; using System.Windows.Forms; namespace ConsoleApplication1 { class Program { static void Main() { Server sr = new Server("MACHINE_NAME\\INSTANCE_NAME"); try { foreach (Database db in sr.Databases) { Console.WriteLine(db.Name); } Console.Read(); } catch (Exception Ex) { MessageBox.Show(Ex.ToString()); } } } } 

La respuesta de Lucas Aardvark es la más apropiada.

 using Microsoft.Win32; RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server"); String[] instances = (String[])rk.GetValue("InstalledInstances"); if (instances.Length > 0) { foreach (String element in instances) { Console.WriteLine(element); // element is your server name } }