C#在连接之前确认数据库的存在

标签: SQLServer C#
发布时间: 2013/6/28 15:33:39

介绍

有时候SQLSERVER服务器的服务并不能使用. 在这篇文章,我会提供一种应用程序的方法在连接之前验证数据库是否存在.

背景

认真的来说, 有时我们的应用程序无法连接数据库有很多个原因. 平静地等待连接超时总是好的选择, 但由于各种原因可能会过度超时, 用户等待连接很长一段时间但还是超时了是很沮丧的一件事. 用户更早知道不可能连接是很好的一个方法.   

这里我想出了一个简单的方法. 

使用代码

SQL数据库通过TCP连接和客户端通信. 下面的代码简单尝试打开一个SOCKET连接到特定机器的特定端口上. 如果它失败了, 它返回false. SQL数据库的默认端口是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取决于连接是成功还是失败. timeout值存储在配置文件中以便于你根据你本地的网络速度来做出改变.
只需调用代码如下:

if(!TestForServer("MySqlServer", 1433))
    throw new ApplicationException("Cannot connection to the Sql Server service on MySqlServer");
官方微信
官方QQ群
31647020