代码之家  ›  专栏  ›  技术社区  ›  iLemming

检查SQL Server可用性的最快方法是什么?

  •  4
  • iLemming  · 技术社区  · 14 年前

    检查SQL Server是否存在的最佳方法是什么?

    我正在尝试Microsoft.sqlserver.management.smo.server.PingQLServerVersion()。 如果服务器存在并且可用,它就可以正常工作。 但是如果没有这样的服务器的话,速度有点慢。

    如果存在服务器,是否有足够快的方法可以在不定义用户凭据(仅服务器名称)的情况下进行检查?

    你推荐使用什么?

    5 回复  |  直到 9 年前
        1
  •  3
  •   armannvg    14 年前

    你可以只用 TcpClient 类来查询服务器并检查特定端口是否打开,可能如下所示:

    using System.Net;
    using System.Net.Sockets;
    
    public bool CheckServerAvailablity(string serverIPAddress, int port)
    {
      try
      {
        IPHostEntry ipHostEntry = Dns.Resolve(serverIPAddress);
        IPAddress ipAddress = ipHostEntry.AddressList[0];
    
        TcpClient TcpClient = new TcpClient();
        TcpClient.Connect(ipAddress , port);
        TcpClient.Close();
    
        return true;
      }
      catch
      {
        return false;
      }
    } 
    
        2
  •  5
  •   Coding Flow    14 年前

    你还可以用 Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion() 但是异步使用它。例如,你可以通过 BackWorker 班级。嫁妆事件会 Microsoft.sqlserver.management.smo.server.pingsqlserverversion()。 . RunWorkerCompleted只会将布尔变量设置为true。这样,您就可以关闭它,等待您想要的任何时间,检查布尔值,如果它不是真的,那么您就知道SQL Server还没有响应,您可以取消BackgroundWorker。

        3
  •  3
  •   Mikael Svenson    14 年前

    您可以尝试打开一个TCP套接字到1433端口(默认的SQL端口),超时时间很短,看看它是否响应。

    这要求SQL Server启用TCP/IP协议。

        4
  •  1
  •   Moose    14 年前

    要添加到Mikael的,您也可以先ping主机,因为如果服务器停机,这将响应最快。

    当然,这都假定您正试图通过TCP/IP访问远程服务器。

        5
  •  0
  •   Michael Fitzpatrick    9 年前

    在使用了本·罗宾逊的答案之后,我想到了这个,它对我有好处。 我使用连接字符串打开然后关闭一个try块中的连接,但当我在Windows8.1上运行时,从未捕获到异常,程序崩溃。

    public unsafe bool OdbcConnectionTest(string sConnectionString
        , out int actualTimeMs)
    {
        DateTime dtme = DateTime.Now;
        OdbcConnectionStringBuilder con;
        Microsoft.SqlServer.Management.Smo.Server svr;
        Microsoft.SqlServer.Management.Common.ServerVersion sVer;
        Microsoft.SqlServer.Management.Smo.Database db;
        try
        {
            con = new System.Data.Odbc.OdbcConnectionStringBuilder(sConnectionString);
            object sServer;
            if (con.TryGetValue("server", out sServer))
            {
                svr = new Microsoft.SqlServer.Management.Smo.Server((string)sServer);
                if (svr != null)
                {
                    sVer = svr.PingSqlServerVersion((string)sServer);
                    if (sVer != null)
                    {
                        object sDb;
                        if (con.TryGetValue("database", out sDb))
                        {
                            if (!String.IsNullOrWhiteSpace((string)sDb))
                            {
                                db = svr.Databases[(string)sDb];
                                if (db != null && db.IsAccessible)
                                {
                                    TimeSpan ts = DateTime.Now - dtme;
                                    actualTimeMs = (int)ts.TotalMilliseconds;
                                    return true;
                                }
                            }
                        }
                    }
                }
            }
        }
        catch 
        {
            actualTimeMs = -1;
            return false;
        }
        actualTimeMs = -1;
        return false;
    }