我使用以下代码列出所有远程和本地 SQL Server 实例:
public static void LocateSqlInstances()
{
using( DataTable sqlSources = SqlDataSourceEnumerator.Instance.GetDataSources())
{
foreach(DataRow source in sqlSources.Rows )
{
string instanceName = source["InstanceName"].ToString();
if (!string.IsNullOrEmpty(instanceName))
{
Console.WriteLine(" Server Name:{0}", source["ServerName"]);
Console.WriteLine(" Instance Name:{0}", source["InstanceName"]);
Console.WriteLine(" Version:{0}", source["Version"]);
Console.WriteLine();
}
}
Console.ReadKey();
}
}
在我的本地计算机上运行代码。该代码可以找到并列出已安装的 SQL Server Express 实例(版本 9.0.5000),但无法列出其他 SQL Server 实例(版本 10.0.1600)。
我在 Internet 上进行了大量研究,并确保 (1) Sql 浏览器正在运行并且 (2) UDP 端口 1434 已打开。
有人知道为什么吗?谢谢。
您将跳过不是命名实例的服务器。修改你的代码:
public class SqlServerInstance
{
public string ServerInstance { get; set; }
public string Version { get; set; }
}
public static List<SqlServerInstance> LocateSqlInstances()
{
List<SqlServerInstance> results = new List<SqlServerInstance>();
using (DataTable sqlSources = SqlDataSourceEnumerator.Instance.GetDataSources())
{
foreach (DataRow source in sqlSources.Rows)
{
string servername;
string instancename = source["InstanceName"].ToString();
if (!string.IsNullOrEmpty(instancename))
{
servername = source["ServerName"].ToString() + '\\' + instancename;
}
else
{
servername = source["ServerName"].ToString();
}
results.Add(new SqlServerInstance (){ ServerInstance = servername, Version = source["Version"].ToString() });
}
}
return results;
}
请注意:SqlDataSourceEnumerator.Instance.GetDataSources()有缺点:
- 受防火墙规则限制(阻止 TCP/IP 1433 和 UDP 1434)
- 如果 SQL 浏览器关闭,则找不到 SQL Server
- 如果 SQL Server 被隐藏,则找不到它们
- 列表内容不保证可重复(由于超时)。事实上,根据网络 I/O、服务器性能、网络上的服务器数量以及其他与时间相关的约束,后续调用很可能会给出不同的列表
有多个消息来源称您必须拨打 2 次电话SqlDataSourceEnumerator.Instance.GetDataSources()
...
Refs:
- SqlDataSourceEnumerator.Instance;不返回所有实例
- EnumAvailableSqlServers 或 SqlDataSourceEnumerator - 可用数据库列表不正确
- 枚举 SQL Server
-
以编程方式列出 SQL Server
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)