首页 新闻 会员 周边

如何检测连接池中Sqlconnection的物理状态

0
悬赏园豆:40 [待解决问题]

当物理连接断开后(比如服务器重启,或网络断开),连接池中的连接仍然有效,此时从连接池获取的连接仍然是正常的,也就是说connection.open仍然正常,不会有任何错误,但在实际执行命令时就会报错,连接池中的连接才会被移除。

但是这样显然会给客户造成不好的体验,因为当前执行不能成功。

对于这种情况,一个方法是在执行命令的时候捕获异常,自动重新执行命令。但是这样的问题是写起来太啰嗦,我希望能够在执行命令之前,比如open的时候就自动重连,这样可以统一处理连接。

代码示意:

bool Open(string database)
        {

            SqlConnection m_sqlCon = SqlCon;//默认是从连接池取的连接
            try
            {
                if (m_sqlCon.State == System.Data.ConnectionState.Closed) 
                    m_sqlCon.Open(); //就连接已经断开,这里也仍然是成功的。
                else if (m_sqlCon.State == ConnectionState.Broken)  //这里也并不能判断
                {
                    m_sqlCon.Close();//close也只是放回连接池,所以这里就算能执行到也没有意义
                    m_sqlCon.Open();
                }

             }
            catch (Exception ex)
            {
                Dispose();
                throw (ex);
            }
            return true;
        }

public int ExecuteSql(String sqlStr)
        {
            if (false == Open()) return -1;
            SqlCommand cmd = new SqlCommand(sqlStr, m_sqlCon);
            return cmd.ExecuteNonQuery();  //这里才会错误
        }

rdlc2的主页 rdlc2 | 初学一级 | 园豆:140
提问于:2011-08-15 16:29
< >
分享
所有回答(1)
0
2012 | 园豆:21230 (高人七级) | 2011-08-16 08:17
这个帖子我昨天看过了。那个人写的不可行,测试过了。

在Open后,那个状态就是Open,那个判断不成立。
支持(0) 反对(0) rdlc2 | 园豆:140 (初学一级) | 2011-08-16 09:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册