检查SQL服务器是否存在的最佳方法是什么?
我正在尝试Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion() 如果服务器存在且可用,它可以正常工作。 但如果没有这样的服务器,它有点慢。
如果服务器存在,是否有足够快的方法来检查甚至没有定义用户凭证(只有服务器名称)?
您建议使用什么?
答案 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;
}