0

我有一段代码应该返回我机器上安装的所有 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。

4

2 回答 2

0

您可以枚举服务器并将它们转换为List<Server>.

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

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

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());
于 2013-04-16T18:43:12.763 回答
0

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

于 2013-04-17T14:51:15.300 回答