在打开 SqlConnection 之前处理不同的 ConnectionStates

Posted

技术标签:

【中文标题】在打开 SqlConnection 之前处理不同的 ConnectionStates【英文标题】:Handling different ConnectionStates before opening SqlConnection 【发布时间】:2010-09-11 08:07:01 【问题描述】:

如果您需要在发出查询之前打开一个 SqlConnection,您可以简单地以相同的方式处理所有非 Open ConnectionStates 吗?例如:

    if (connection.State != ConnectionState.Open)
    
        connection.Open();
    

我在某处读到,对于 ConnectionState.Broken,连接需要在重新打开之前关闭。有任何人对此有经验吗?谢谢-

【问题讨论】:

【参考方案1】:

这不是直接回答您的问题,但最佳做法是为每次访问数据库打开和关闭连接。 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

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

【讨论】:

您不应等待 GC 关闭并释放连接。完成使用后,您应该明确关闭连接。 using 语句确保连接关闭,即使抛出异常也是如此。它不会等待 GC 关闭它。 这种使用模式是所有数据访问的外观。您永远不会以这种方式泄漏连接。 Joe,我还会在 SqlConnection 的 using 中添加“using (SqlCommand command...”),并为查询字符串推荐一个常量,以确保它始终来自同一个池。【参考方案2】:

http://msdn.microsoft.com/en-us/library/system.data.connectionstate.aspx

断开连接状态确实需要关闭并重新打开才能继续使用。

编辑:不幸的是,关闭已关闭的连接也会停止。在对未知连接进行操作之前,您需要测试 ConnectionState。也许一个简短的 switch 语句就可以解决问题。

【讨论】:

【参考方案3】:

你可以用同样的方式处理它。在使用 IE9 时,我遇到了许多连接状态 == 中断。 IE9 在这方面存在根本性的问题,因为在对数据库表进行 5 或 6 次更新后,没有其他浏览器出现连接状态断开的问题。所以我使用对象上下文。所以基本上只需关闭它并重新打开它。

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

if (context.Connection.State == System.Data.ConnectionState.Broken)

    context.Connection.Close();
    context.Connection.Open();

【讨论】:

以上是关于在打开 SqlConnection 之前处理不同的 ConnectionStates的主要内容,如果未能解决你的问题,请参考以下文章

“打开/关闭”SqlConnection还是保持打开状态?

使用 Impersonation 打开 SQLconnection 时出现 TypeInitializationException

我是不是必须在处理 SQLConnection 之前关闭()它?

处理SqlConnection、SqlDataReader、SqlCommand 时要捕获哪些异常?

SQLConnection 实例通过 Dapper 处理

求大侠帮忙,好多次调试都在SqlConnection conn = new SqlConnection(connStr);出现用户代码未处理