在打开 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的主要内容,如果未能解决你的问题,请参考以下文章
使用 Impersonation 打开 SQLconnection 时出现 TypeInitializationException
我是不是必须在处理 SQLConnection 之前关闭()它?
处理SqlConnection、SqlDataReader、SqlCommand 时要捕获哪些异常?
求大侠帮忙,好多次调试都在SqlConnection conn = new SqlConnection(connStr);出现用户代码未处理