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