Come elencare le istanze disponibili di SQL Server usando SMO in C #?

Qualcuno può spiegarmi cosa ho sbagliato che sto facendo nel seguente pezzo di codice:

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

Fornisce un’eccezione in sr.Databases che non possono essere connessi.

Dai uno sguardo ai seguenti link che potrebbero essere utili:

  • Enumerare le istanze di SQL Server in C #, utilizzando ODBC
  • Come ottenere un elenco di SQL Server disponibili utilizzando C # (MSDN)
  • Compilazione di un elenco di server SQL

In alternativa puoi cambiare il tuo codice a questo:

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

Spero che questo risolva il tuo problema.

Hai un server SQL con il nome dell’istanza Test ? Se no, questo è il tuo problema.

Sembra che tu stia cercando di enumerare tutte le istanze locali di SQL Server. Se è così, questo codice funzionerà:

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

Nel caso in cui la domanda sia titolata in modo errato, ovvero vuole trovare i database nell’istanza particolare:

 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 risposta di Else Lucas Aardvark è la più appropriata.

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