在打开 SqlConnection 之前处理不同的连接状态

6
如果在发出查询之前需要打开一个SqlConnection,那么您是否可以简单地以相同的方式处理所有非“Open”ConnectionStates?例如:
    if (connection.State != ConnectionState.Open)
    {
        connection.Open();
    }

我在某个地方读到,对于ConnectionState.Broken状态,需要在重新打开之前关闭连接。有没有人有相关经验?谢谢。

3个回答

6

5

这并不是直接回答你的问题,但最佳实践是为每次访问数据库打开和关闭一次连接。ADO.NET连接池确保了这种方式的良好性能。在服务器应用程序(如ASP.NET)中进行此操作尤为重要,但即使在直接访问数据库的WinForms应用程序中也应该这样做。

示例:

using(SqlConnection connection = new SqlConnection(...))
{
   connection.Open();
   // ... do your stuff here

}  // Connection is disposed and closed here, even if an exception is thrown

这样一来,在打开连接时就不需要检查连接状态了。


你不应该等待垃圾回收来关闭和释放连接。你应该在使用完连接后显式地关闭它。 - ddc0660
1
using语句确保连接关闭,即使抛出异常也是如此。它不等待垃圾回收器关闭它。 - Joe
1
这种使用模式是所有数据访问应该采用的方式。这样做,你就永远不会泄露连接。Joe,我还会在SqlConnection的using语句中添加"using (SqlCommand command...",并建议使用常量来存储查询字符串,以确保它始终来自同一个池。 - Eric Z Beard

3
你可以用同样的方式处理。在使用IE9时,我一直遇到“连接状态==中断”的问题。在更新数据库表5或6次后,其他浏览器都没有这个中断连接状态的问题,所以IE9在这方面存在根本性问题。因此,我使用对象上下文。基本上只需关闭它,然后重新打开它。

在业务逻辑层中,在所有读取和更新之前,我都有这段代码:

if (context.Connection.State == System.Data.ConnectionState.Broken)
{
    context.Connection.Close();
    context.Connection.Open();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接