2

我正在尝试编写一些代码来确定 SQL 服务器列表是否已启动。我尝试过 WMI、SQLDMO、SqlDataSourceEnumerator 和 Ping 每台服务器的 1433 端口,都取得了不同程度的成功(见下面的结果)。

使用 SQLDMO 和 SqlDataSourceEnumerator,我在 6 个中找到了 3 个,必须说 3 个缺失的 SQL 服务器中有 2 个形成了一个集群。

ping 端口 1433 找到 6 个中的 4 个,缺少的 2 个是组成 SQL 集群的 2 个服务器。

WMI 被证明是最不成功的,因为它只找到了 6 台服务器中的 1 台。

这是我用来原型化服务器发现的代码:

private void buildServerMap(bool useLibCOM)
    {
        sqlServersMap = new Dictionary<string, string>();

        if (useLibCOM)
        {
            //get all available SQL Servers     
            SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass();
            SQLDMO.NameList sqlServers = sqlApp.ListAvailableSQLServers();

            ArrayList servs = new ArrayList();
            for (int i = 0; i < sqlServers.Count; i++)
            {
                object srv = sqlServers.Item(i + 1);

                if (srv != null)
                {
                    sqlServersMap.Add(srv.ToString(), srv.ToString());
                }
            }
        }
        else
        {
            System.Data.Sql.SqlDataSourceEnumerator enumSQL = System.Data.Sql.SqlDataSourceEnumerator.Instance;

            System.Data.DataTable table = enumSQL.GetDataSources();

            foreach (System.Data.DataRow row in table.Rows)
            {

                foreach (System.Data.DataColumn col in table.Columns)
                {
                    sqlServersMap.Add((string)row[col], (string)row[col]);
                }
            }
        }
    }

    private bool pingSqlServer(string server)
    {
        bool success = false;

        TcpClient client = new TcpClient();

       try 
        {           
            client.Connect(server, 1433);

            success = true;
        }
        catch (Exception)
        {

            //throw;
        }

        return success;
    }

    public StringBuilder buildWmiServerList(string path, string sqlServer, string sqlServerServiceName, StringBuilder sb, out bool reportNeeded)
    {
        reportNeeded = false;

        try
        {
            ManagementScope ms = new ManagementScope(path);

            ms.Connect();

            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Service WHERE Started = TRUE AND DisplayName='" + sqlServerServiceName + "'");
            searcher.Scope = ms;

            if (searcher != null && searcher.Get() != null)
            {
                foreach (ManagementObject service in searcher.Get())
                {
                    sb.Append(sqlServer + " SQL Server service - RUNNING\n");
                }
            }
        }
        catch (Exception e)
        {
            sb.Append(sqlServer + " SQL Server service - UNVERIFIABLE\n");
            reportNeeded = true;
        }

        return sb;
    }

关于如何解析/检测形成 SQL 集群的 SQL 服务器的任何想法?

4

2 回答 2

3

我不知道无论如何都已弃用的 DMO,但在 SMO 中您可以执行 Server.IsClustered。

您可能还想看看这个: http ://www.sqldbtips.com/showarticle.asp?ID=45

于 2009-01-19T18:15:27.503 回答
1

为什么不试试SQL ping呢?这里有源代码,所以你可以看到他们是如何做到的。

无论如何,一些想法:

您是在尝试物理服务器、集群名称还是虚拟服务器名称,例如 phys1、phys2、vclus、vserv1、vserv2(假设为主动/主动)?

您是否使用客户端的 tcp 或命名管道?你试过 tcp:vserv1 吗?例如,如果禁用然后启用,命名管道在集群 IIRC 上可能会很有趣。使用的协议列在 SQL 日志中,以及使用的 tcp 端口(命名实例 = 随机)

您可以在客户端上创建系统 DSN 吗?从中可以算出 HKLM\SW\Microsoft\MSSQLServer 下使用的是什么端口和协议

于 2009-01-19T20:39:11.817 回答