我如何使用System.Data.Sql.SqlDataSourceEnumerator类来了解可用的 sql 数据源...?因为当我创建到 sql server 的连接时,如果 sql server 没有准备好,我们会得到异常......所以首先我想知道 sql server 是否准备好接受请求......如何知道它......。
问问题
4410 次
3 回答
2
因此,根据以下参考资料:
http://blogs.msdn.com/b/sushilc/archive/2004/10/14/242395.aspx
http://sqlblogcasts.com/blogs/jonsayce/archive/2008/02/10/programatically-listing-sql-servers.aspx
GetDataSources() 不是一个完美的方法,这意味着它可能不会在第一次尝试时列出所有可用的数据源。事实上,我发现它也没有列出你所有的本地资源。
出于我的目的,我在程序启动和需要获取可用资源列表之间有一段时间,无论是在网络上还是在本地。因此,我将代码放在一个线程中,该线程会永远收集所有来源。它在下面。如果您取出 while 循环,您可以手动多次调用它。
private List<string> sqlInstances = new List<string>();
private void collectInstances()
{
while (true)
{
System.Data.Sql.SqlDataSourceEnumerator instance = System.Data.Sql.SqlDataSourceEnumerator.Instance;
System.Data.DataTable dataTable = instance.GetDataSources();
foreach (DataRow row in dataTable.Rows)
{
string instanceName = String.Format(@"{0}\{1}", row["ServerName"].ToString(), row["InstanceName"].ToString());
//Do not add the local instance, we will add it in the next section. Otherwise, duplicated!
if (!sqlInstances.Contains(instanceName) && !instanceName.Contains(Environment.MachineName))
{
sqlInstances.Add(instanceName);
}
}
/*
* For some reason, GetDataSources() does not get local instances. So using code from here to get them
* http://stackoverflow.com/questions/6824188/sqldatasourceenumerator-instance-getdatasources-does-not-locate-local-sql-serv
*/
List<string> lclInstances = GetLocalSqlServerInstanceNames();
foreach (var lclInstance in lclInstances)
{
string instanceName = String.Format(@"{0}\{1}", Environment.MachineName, lclInstance);
if (!sqlInstances.Contains(instanceName)) sqlInstances.Add(instanceName);
}
sqlInstances.Sort();
}
}
//Got code from: http://stackoverflow.com/questions/6824188/sqldatasourceenumerator-instance-getdatasources-does-not-locate-local-sql-serv
/// <summary>
/// get local sql server instance names from registry, search both WOW64 and WOW3264 hives
/// </summary>
/// <returns>a list of local sql server instance names</returns>
public static List<string> GetLocalSqlServerInstanceNames()
{
RegistryValueDataReader registryValueDataReader = new RegistryValueDataReader();
string[] instances64Bit = registryValueDataReader.ReadRegistryValueData(RegistryHive.Wow64,
Registry.LocalMachine,
@"SOFTWARE\Microsoft\Microsoft SQL Server",
"InstalledInstances");
string[] instances32Bit = registryValueDataReader.ReadRegistryValueData(RegistryHive.Wow6432,
Registry.LocalMachine,
@"SOFTWARE\Microsoft\Microsoft SQL Server",
"InstalledInstances");
//FormatLocalSqlInstanceNames(ref instances64Bit);
//FormatLocalSqlInstanceNames(ref instances32Bit);
List<string> localInstanceNames = new List<string>(instances64Bit);
foreach (var item in instances32Bit)
{
if (!localInstanceNames.Contains(item)) localInstanceNames.Add(item);
}
//localInstanceNames = localInstanceNames.Union(instances32Bit).ToList();
return localInstanceNames;
}
于 2012-12-21T16:24:10.227 回答
0
GetDataSources() 可以帮助你,你试过了吗?
于 2012-12-21T12:38:06.310 回答
0
目前 SqlDataSourceEnumerator 在 .NetCore 或 .Net5 中也不可用,虽然不是 SqlDataSourceEnumerator 的直接替代品,但您可以尝试使用 Udp 解决方案。
这个 repo 是针对 .Net5 的,但代码在 .NetCore 风格上应该可以正常工作。
于 2020-11-24T04:16:58.637 回答