【问题标题】:How to list available instances of SQL Servers using SMO in C#?如何在 C# 中使用 SMO 列出可用的 SQL Server 实例?
【发布时间】: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”??

标签: c# .net sql-server smo


【解决方案1】:

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

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

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 位应用程序也是如此
  • 是否可以在不访问注册表的情况下获取已安装的实例?
猜你喜欢
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多