SqlDataSourceEnumerator.Instance.GetDataSources() 找不到本地 SQL Server 2008 实例

2023-11-30

我使用以下代码列出所有远程和本地 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(使用前将#替换为@)

SqlDataSourceEnumerator.Instance.GetDataSources() 找不到本地 SQL Server 2008 实例 的相关文章

随机推荐