如何在C#中使用SMO列出可用的SQL Server实例?

任何人都可以在下面的代码中解释我的错误:

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

它在sr.Databases中提供了一个无法连接的例外。

看看以下链接,他们可能会有所帮助:

  • 使用ODBC在C#中枚举SQL Server实例
  • 如何使用C#(MSDN)获取可用SQL Server的列表
  • 填充SQL Server列表

或者,您可以将代码更改为:

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

希望这能解决你的问题。

你有一个实例名称为Test的SQL Server吗? 如果没有,那就是你的问题。

看起来您正在尝试枚举所有本地SQL Server实例。 如果是这样,这段代码将起作用:

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

以防万一标题错误,即他想在特定实例中找到数据库:

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

其他Lucas Aardvark的回答是最合适的。

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