如何在 C# 中使用 SMO 列出可用的 SQL Server 实例?
Posted
技术标签:
【中文标题】如何在 C# 中使用 SMO 列出可用的 SQL Server 实例?【英文标题】:How to list available instances of SQL Servers using SMO in C#? 【发布时间】:2010-11-10 23:06:06 【问题描述】:谁能解释我在以下代码中做错了什么:
DataTable dt=SmoApplication.EnumAvailableSqlServer(true);
Server sr = new Server("Test");
foreach(DataBase db in sr.DataBases)
Console.WriteLine(db["name"]);
它在sr.Databases
中给出了一个无法连接的异常。
【问题讨论】:
可能是您的防火墙(或其他东西)阻止了 osql 尝试查找可用实例的广播? 你为什么要枚举 SQL Server,然后仍然只实例化一个“TEST”?? 【参考方案1】:查看以下链接,它们可能会有所帮助:
Enumerate SQL Server Instances in C#, Using ODBC How to get a list of available SQL Servers using C# (MSDN) Populating a list of SQL Servers或者,您可以将代码更改为:
DataTable dt = SmoApplication.EnumAvailableSqlServers(false);
if (dt.Rows.Count > 0)
foreach (DataRow dr in dt.Rows)
Console.WriteLine(dr["Name"]);
希望这能解决您的问题。
【讨论】:
问题说他/她需要找到实例名称。但他/她给出的代码是用于在特定 SQLServer 实例中查找数据库。 这个问题(不是不相关的答案)把我带到了这里,所以恕我直言,这是最好的答案,我会补充一下:如果你正在寻找 SmoApplication,这对我最有效:GitHub 的“ Unofficial.Sql.Server.Management.Objects. 上面的代码只给了我网络服务器。如果我想要本地和网络服务器怎么办。【参考方案2】:您是否有实例名称为 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"]);
【讨论】:
上面的代码只给了我网络服务器。如果我想要本地和网络服务器怎么办。【参考方案3】:以防问题标题错误,即他想在特定实例中查找数据库:
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());
其他卢卡斯土豚的答案是最合适的。
【讨论】:
您不需要调用 SmoApplication.EnumAvailableSqlServers,因为没有使用返回值。【参考方案4】: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
【讨论】:
如果编译为 32 位应用程序,这将只返回 32 位服务器,对于 64 位应用程序也是如此 是否可以在不访问注册表的情况下获取已安装的实例?以上是关于如何在 C# 中使用 SMO 列出可用的 SQL Server 实例?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 中使用 SMO 使用 FILE STREAM 备份和恢复数据库
使用 SMO.Agent 检索 SQL 作业执行状态 - 安全问题