检查SQL服务器可用性的最快方法是什么?

时间:2010-07-15 15:25:29

标签: c# sql-server smo

检查SQL服务器是否存在的最佳方法是什么?

我正在尝试Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion() 如果服务器存在且可用,它可以正常工作。 但如果没有这样的服务器,它有点慢。

如果服务器存在,是否有足够快的方法来检查甚至没有定义用户凭证(只有服务器名称)?

您建议使用什么?

5 个答案:

答案 0 :(得分:5)

您仍然可以使用Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion()但是异步使用它。例如你可以通过BackWorker课程来调用它。 DoWork事件将调用Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion()。 RunWorkerCompleted只是将布尔变量设置为true。这样你就可以关闭它,等待你想要的多久,检查布尔值,如果不是真的那么你就会知道SQL服务器还没有响应,你可以取消BackgroundWorker。

答案 1 :(得分:3)

您可以尝试使用短暂超时打开tcp套接字到端口1433(默认sql端口),看看它是否响应。

这要求SQL服务器启用TCP / IP协议。

答案 2 :(得分:3)

您可以使用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;
  }
} 

答案 3 :(得分:1)

要添加到Mikael,您还可以先ping主机,因为如果服务器关闭,它将以最快的速度响应。

当然,这一切都假设您正在尝试通过TCP / IP访问远程服务器。

答案 4 :(得分:0)

在使用本·罗宾逊的答案后,我想出了这个,对我来说效果很好。 我正在使用连接字符串打开然后关闭try块中的连接但是当我在Windows 8.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;
}