为什么我的方法不返回任何有效的SQL Server实例?

时间:2013-04-16 18:26:00

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

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

2 个答案:

答案 0 :(得分:0)

您可以枚举服务器并将其转换为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());

答案 1 :(得分:0)

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