连接前检查 Sql Server 是否存在






4.80/5 (26投票s)
验证 Sql Server 是否存在
介绍
有时 Sql Server 数据库服务器服务不可用。 在本文中,我将提供一种方法,让应用程序在连接之前验证 Sql Server 服务是否存在。
背景
失败是常有的事。 生活的现实。 接受它!
说真的,我们的应用程序有时可能由于各种原因无法连接到 Sql Server 服务。 等待连接超时并优雅地处理它始终是一个不错的选择,但由于各种原因,您的超时时间可能会过长,让用户等待很长时间才能连接,而连接最终会失败,这会让他们感到沮丧。 如果用户能更早地知道他们无法执行原本要执行的操作,那会更好(并且稍微提高效率)。
这是我提出的解决这个简单但令人沮丧问题的方法。
使用代码
Sql Server 通过 TCP 连接与客户端通信。 下面的代码只是尝试打开到指定机器的指定 TCP 端口的套接字连接。 如果失败,则返回 false。 Sql Server 的默认端口是 1433,但该方法接受端口号作为参数。 您也可以将 IP 地址作为地址参数,或机器名称,但 DNS 必须能够找到该机器。
using System.Configuration;
using System.Net.Sockets;
private bool TestForServer(string address, int port)
{
int timeout = 500;
if(ConfigurationManager.AppSettings["RemoteTestTimeout"] != null)
timeout = int.Parse(ConfigurationManager.AppSettings["RemoteTestTimeout"]);
var result = false;
try
{
using(var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
IAsyncResult asyncResult = socket.BeginConnect(address, port, null, null);
result = asyncResult.AsyncWaitHandle.WaitOne(timeout, true);
socket.Close();
}
return result;
}
catch { return false; }
}
请注意 timeout
变量。 由于 TCP 连接不是立即建立的,因为网络流量、速度等原因,连接尝试会等待指定的毫秒数后返回。 IAsyncResult.AsncyWaitHandle.WaitOne
根据是否建立连接返回 true 或 false。 超时值存储在配置文件中,以便于操作,因为您可能需要根据自己的本地网络速度更改此值。
只需按如下方式调用代码:
if(!TestForServer("MySqlServer", 1433))
throw new ApplicationException("Cannot connection to the Sql Server service on MySqlServer");
值得关注的点
上述方法不仅限于 Sql Server。 它还可以用于验证使用 TCP 套接字的其他数据库平台的存在。 我已经成功地使用它来检查 FireBird 服务器是否存在。 该方法的另一个有趣用途是检查用户是否正在断开连接模式下运行,从而切换到本地数据库,然后在重新连接到网络时同步该数据库。
历史
6/27/2013 | 原始提交 |