检查SQL服务器是否存在的最佳方法是什么?检查SQL Server可用性的最快方法是什么?
我在尝试Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion() ,如果服务器存在且可用,它工作正常。 但它有点慢,如果没有这样的服务器。
如果服务器存在,是否有足够快速的方法来检查,甚至不需要定义用户凭证(只有服务器名称)?
你推荐使用什么?
检查SQL服务器是否存在的最佳方法是什么?检查SQL Server可用性的最快方法是什么?
我在尝试Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion() ,如果服务器存在且可用,它工作正常。 但它有点慢,如果没有这样的服务器。
如果服务器存在,是否有足够快速的方法来检查,甚至不需要定义用户凭证(只有服务器名称)?
你推荐使用什么?
你可以只使用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;
}
}
对我来说,这对默认实例工作正常,但对于非默认实例失败。 我发现这个解决方案,它可以在所有情况下工作: http://www.codeproject.com/Articles/612751/Check-that-Sql-Server-exists-prior-to-connection – Toolsmythe 2016-06-13 22:37:30
你可以尝试打开一个tcp套接字到端口1433(默认的sql端口)并且看看它是否响应。
这要求SQL服务器启用TCP/IP协议。
要添加到Mikael's,您还可以首先ping主机,因为如果服务器关闭,它会响应最快。
当然,这一切都假设您正尝试通过TCP/IP访问远程服务器。
你仍然可以使用Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion()
但异步使用它。例如你可以通过BackWorker课程来调用它。 DoWork活动将致电Microsoft.SqlServer.Management.Smo.Server.PingSqlServerVersion()
。 RunWorkerCompleted只会将布尔变量设置为true。用这种方法你可以将它关闭,然后等待很长时间,检查布尔值,如果它不是真的,那么你会知道SQL服务器还没有响应,你可以取消BackgroundWorker。
使用本罗宾逊的答案后,我想出了这个,它对我很好。 我正在使用连接字符串打开然后关闭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;
}
这是如何有用?在什么情况下,有人会部署数据库应用程序而不知道是否有数据库? – mikerobi 2010-07-15 15:27:58
我们确实需要知道缓慢响应的服务器在多大程度上被视为不可用。 – Richard 2010-07-15 15:29:58