2010-07-15 60 views
4

检查SQL服务器是否存在的最佳方法是什么?检查SQL Server可用性的最快方法是什么?

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

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

你推荐使用什么?

+0

这是如何有用?在什么情况下,有人会部署数据库应用程序而不知道是否有数据库? – mikerobi 2010-07-15 15:27:58

+0

我们确实需要知道缓慢响应的服务器在多大程度上被视为不可用。 – Richard 2010-07-15 15:29:58

回答

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

对我来说,这对默认实例工作正常,但对于非默认实例失败。 我发现这个解决方案,它可以在所有情况下工作: http://www.codeproject.com/Articles/612751/Check-that-Sql-Server-exists-prior-to-connection – Toolsmythe 2016-06-13 22:37:30

3

你可以尝试打开一个tcp套接字到端口1433(默认的sql端口)并且看看它是否响应。

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

1

要添加到Mikael's,您还可以首先ping主机,因为如果服务器关闭,它会响应最快。

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

5

你仍然可以使用Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion()但异步使用它。例如你可以通过BackWorker课程来调用它。 DoWork活动将致电Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion()。 RunWorkerCompleted只会将布尔变量设置为true。用这种方法你可以将它关闭,然后等待很长时间,检查布尔值,如果它不是真的,那么你会知道SQL服务器还没有响应,你可以取消BackgroundWorker。

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; 
} 
相关问题