读书人

监测远程数据库连接状态的线程小弟我

发布时间: 2012-09-10 11:02:33 作者: rapoo

监测远程数据库连接状态的线程,我的实现有问题。
写了一个函数,想放在线程中启动运行,用来检测数据库服务(本地或远程)是否处于可连接状态。
自己的思路是,在线程中创建一个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()之前就判断是否可连接

读书人网 >C#

热点推荐