【问题标题】:Why isn't my method returning any valid SQL Server instances?为什么我的方法没有返回任何有效的 SQL Server 实例?
【发布时间】:2013-04-16 18:25:59
【问题描述】:

我有一段代码应该返回我机器上安装的所有 SQL Server 实例。它看起来像这样:

DataTable dtLocalServers = SmoApplication.EnumAvailableSqlServers(true);

foreach (DataRow dServer in dtLocalServers.Rows)
{
   Console.WriteLine(dServer.ToString());
}

它可以工作、编译和运行。但是,生成的数据表不是很有用。它看起来像这样:

Name    |  Server   |   Instance   |   IsClustered | Version   |   IsLocal
IAN-PC  |  IAN-PC   |              |   True        |           |   True

问题是虽然这会返回一个结果,但这并没有给我任何关于服务器的信息。特别是,我正在尝试获取版本(SQL Server 2008 Express R2 或 SQL Server Express 2012),我假设它应该在“版本”字段中。我知道我有两个副本在本地运行以进行此测试。

我还能做些什么来获得更好的结果吗?

编辑:IAN-PC 是我电脑的名称。我的电脑上有两个正在运行的 SQL Server 实例,IANSQLEXP (SQL Server 2008 Express R2) 和 SQLEXPRESS (SQL Server Express 2012)。在 SQL Server 配置管理器中,还有两个未运行的代理和一个未运行的 SQL Server Browser。

【问题讨论】:

  • 您的表格有一列 Version。如果服务器是集群的,它不会返回版本。
  • 我理解那部分。没有其他方法可以检查服务器吗?我们希望在客户的计算机上提供服务,因此我们无法控制它们是否是集群的,并且仍想检查安装的内容。这可能是个愚蠢的问题,我不熟悉 SQL Server 的工作原理。
  • 你的集群实例是命名实例吗?
  • @AaronBertrand 我不确定,我该如何检查?
  • 使用 Management Studio 连接并运行 SELECT @@SERVERNAME;

标签: c# sql-server sql-server-2008-r2 smo


【解决方案1】:

您可以枚举服务器并将它们变成List<Server>

var servers =
    SmoApplication
        .EnumAvailableSqlServers()
        .AsEnumerable()
        .Select(s => new Server(s[0].ToString())) //Server name is first column
        .ToList();

您可以使用Server 上的Version 属性来获取服务器版本。

var unavailableServers= new List<Server>();
var activeServers = new List<Server>();
var tasks = new List<Task>();

foreach(var server in servers)
{
    var task =
        Task.Run(() =>
            {
                try
                {

                    server.ConnectionContext.Connect();
                    server.ConnectionContext.Disconnect();
                    activeServers.Add(server);
                }
                catch(ConnectionFailureException)
                {
                    unavailableServers.Add(server);
                }
            });

    tasks.Add(task);
}

Task.WaitAll(tasks.ToArray());

【讨论】:

  • 当我这样做时,我得到了与以前相同的结果(以服务器形式),当我尝试获取版本时,我深入挖掘并收到一条消息,上面写着base {System.SystemException} = {"Failed to connect to server IAN-PC."}。我觉得集群是这里的问题。
  • 您需要检查您是否可以访问服务器。检查我的编辑。
  • 我得到一个空的活动服务器列表。我不太确定这里发生了什么,但似乎它正在将计算机名称作为服务器,也许那是集群。无论如何,我觉得这种方法行不通:(
  • 你应该尝试直接连接到服务器var server = new Server("IAN-PC"); var version = server.VersionString;,看看它是否会抛出或者你是否需要身份验证。
  • 它会抛出一个ConnectionFailureException,所以我猜这意味着它需要身份验证。此外,我更新了问题的描述,以更清楚地说明这一切是如何运作的。
【解决方案2】:

这里的问题是我的计算机上的 SQL Server Browser 已停用。我找到答案的帖子是here。另一个来自 MSDN 的有用链接是 here. 谢谢你们的帮助,伙计们!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 2019-03-08
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多