如何检查SQL服务器是否存在?
我正在尝试使用Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion(),如果服务器存在且可用,则可以正常工作。但是,如果没有这样的服务器,它会变得相当缓慢。
是否有足够快速的方法来检查服务器是否存在,而无需定义用户凭据(仅服务器名称)?
您推荐使用什么方法?
如何检查SQL服务器是否存在?
我正在尝试使用Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion(),如果服务器存在且可用,则可以正常工作。但是,如果没有这样的服务器,它会变得相当缓慢。
是否有足够快速的方法来检查服务器是否存在,而无需定义用户凭据(仅服务器名称)?
您推荐使用什么方法?
Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion()
,但需要异步使用。例如,你可以通过BackWorker类来调用它。在 DoWork 事件中调用 Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion()
,而 RunWorkerCompleted 只需将一个布尔变量设置为 true。这样,你就可以发起请求,等待任意长时间,检查布尔值,如果不为 true,则说明 SQL server 尚未响应,你可以取消 BackgroundWorker。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;
}
}
这需要启用SQL服务器的TCP/IP协议。
补充Mikael的建议,您还可以先ping主机,如果服务器宕机,这将最快地响应。
当然,这一切都假设您正在尝试通过TCP/IP连接到远程服务器。
在使用Ben Robinson的答案后,我想出了这个方法,并且对我来说效果很好。 我之前是在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;
}