【问题标题】:how can i use System.Data.Sql.SqlDataSourceEnumerator class to know available sql datasources...?我如何使用 System.Data.Sql.SqlDataSourceEnumerator 类来了解可用的 sql 数据源...?
【发布时间】:2012-12-21 05:51:04
【问题描述】:

我如何使用 System.Data.Sql.SqlDataSourceEnumerator 类来了解可用的 sql 数据源...? 因为当我创建与 sql server 的连接时,如果 sql server 没有准备好,我们会得到异常……所以首先我想知道 sql server 是否准备好接受请求……如何知道它……。

【问题讨论】:

    标签: c# asp.net sql sql-server


    【解决方案1】:

    所以,根据以下参考资料:

    http://social.msdn.microsoft.com/forums/en-US/sqlsmoanddmo/thread/49ba019f-e8b5-457c-80ea-fac5febb9d3d/

    http://connect.microsoft.com/SQLServer/feedback/details/146323/enumavailablesqlservers-or-sqldatasourceenumerator-incorrect-list-of-available-databases

    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;
            }
    

    【讨论】:

      【解决方案2】:

      GetDataSources() 可以帮到你,你试过了吗?

      SqlDataSourceEnumerator.GetDataSources Method

      【讨论】:

      • 请务必调用此方法两次,第一次尝试可能无法列出所有内容。
      【解决方案3】:

      目前 SqlDataSourceEnumerator 在 .NetCore 或 .Net5 中均不可用,并且 虽然不是 SqlDataSourceEnumerator 的直接替代品,但您可以尝试使用 Udp 解决方案。

      此 repo 针对 .Net5,但代码在 .NetCore 风格上应该可以正常工作。

      https://github.com/mrsquish/SqlBrowserClient

      【讨论】:

        猜你喜欢
        • 2017-01-20
        • 1970-01-01
        • 1970-01-01
        • 2013-05-31
        • 1970-01-01
        • 2020-10-17
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        相关资源
        最近更新 更多