如何在 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 备份和恢复数据库

通过 C# 和 SMO 检查和删除现有表

使用 SMO 重启 SQL Server 实例

使用 SMO.Agent 检索 SQL 作业执行状态 - 安全问题

ScriptingOptions sql smo 不支持脚本数据

将现有数据库加入可用性组