日期:2014-05-18  浏览次数:20848 次

监测远程数据库连接状态的线程,我的实现有问题。
写了一个函数,想放在线程中启动运行,用来检测数据库服务(本地或远程)是否处于可连接状态。
自己的思路是,在线程中创建一个SqlConnection对象,不停的Open()来检测其State为Open或Closed。

1)这样做首先是产生很多异常:
我把sql数据库服务关闭时,产生异常“在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)”;
把数据库服务打开时,产生异常“连接未关闭。 连接的当前状态为打开。”;

2)其次sql数据库服务从关闭到打开的时候,可以看到我程序的状态栏从“断开”变成了“连通”;
而当我把数据库服务停掉的时候,程序状态栏却始终保持“连通”不变。

不知道是怎么回事。或者有更好的做法?我的目的只是要检测数据库是否处于可连接状态,即网络不通、数据库服务没启动,等等状态统统都检测为“断开”;而当检测为“连通”时,必须是可以通过conn.Open()打开数据库连接。

C# code

using (SqlConnection conn = new SqlConnection(Config.SQL_CONN_STR))
{
    while (true)
    {
        try
        {
            conn.Open();
        }
        catch (Exception ex)
        {
            if (conn.State == ConnectionState.Closed)
            {
                //把我的程序的状态栏的Label设置为断开
                sspsl_ConnState.Text = "断开";
            }
            else if (conn.State == ConnectionState.Open)
            {
                sspsl_ConnState.Text = "连通";
                conn.Close();
            }
            //下面三行是我自己写的异常记录日志,下面会把日志记录贴出来
            StackTrace st = new StackTrace(new StackFrame(true));
            StackFrame sf = st.GetFrame(0);
            Tool.WriteLog(true , ex , st , sf);
        }

        
        Thread.Sleep(1000);
    }
}



------解决方案--------------------
顶一下, 不知道 啊。
是不是 最后断开 服务后, 只记录了最后一次 状态 但是 不会变了? 因为 程序 不知道 服务已经停了,可是 只是到 最后的 状态是 连接的, 因为 程序 只知道 程序 自己的 断开 和 打开,不知道 服务(外界的原因)??? 
愚见
------解决方案--------------------
探讨

我补充一下吧,可能我之前表达的不清楚:

我之前是用 SqlConnection.Open() 和 SqlConnection.State 这两个方法跟属性来组合判断是否能连接;但是.Open()方法本身在不能连接的状态下(比如数据库服务没启动,网络有问题)就会报错,所以我希望能在使用Open()之前就判断是否可连接