【问题标题】:The connection was not closed, The connection's current state is open连接未关闭,连接的当前状态为打开
【发布时间】:2013-09-30 08:08:32
【问题描述】:

我正在编写一个 ASP.NET 应用程序。在我的数据层中,在查询之前和之后打开和关闭了一个 sql 连接。 SqlConnection 被保存为单个类的私有字段。类中的每个数据库调用都使用相同的结构:

        conn.Open();

        try
        {
            // database querying here
        }
        finally
        {
            conn.Close();
        }

然而,在极少数情况下,我会收到异常“连接未关闭。连接的当前状态为“打开”。无法重现该问题,因为它很少源自代码的不同部分。我的应用程序中涉及到一些线程,但新线程也创建了新的数据层类,从而产生了新的连接对象。

我不明白如何使用上面的代码让连接在打开状态下徘徊。连接打开后不应该一直关闭,就不可能出现上面的异常吗?

【问题讨论】:

  • 这里重要的是你的 conn 对象在哪里被实例化?
  • 另外:使用 'using' 有什么问题?
  • 只使用 using 语句?保证连接被关闭和处理。
  • 如果可能,请尝试将您的连接包装在 using(SQLConnection conn = new SQLConnection(xxx)) { ... } 语句中,看看您是否仍然可以重现错误。这样,当代码退出时,GC 会清理 SQL 连接
  • 在哪里你得到这个异常?在贴出的代码中?如果没有,您可以发布更多代码吗?

标签: c# asp.net


【解决方案1】:

很可能在try 块中引发了您未处理的异常。请参阅 MSDN 中的此注释以获取 try-finally

在处理的异常中,保证运行相关的 finally 块。但是,如果异常未处理,finally 块的执行取决于异常展开操作的触发方式。

无论如何,我建议将连接包装在 using 块中:

using (SqlConnection connection = new SqlConnection(connectionString))
{
     //etc...
}

或者,将 catch 块添加到 try-finally

    conn.Open();

    try
    {

    }
    catch
    {

    }
    finally
    {
        conn.Close();
    }

【讨论】:

  • 谢谢,这解释了为什么 conn.Close() 有时不运行。我不知何故相信 finally { } 无论如何都会运行。
  • 没问题。如果这回答了您的问题,您应该考虑将其标记为答案,以帮助面临类似问题的其他用户。
  • @user2830395 你是对的,finally 块无论如何都会执行,即使发生异常也是如此。如果这个答案中的代码解决了这个问题,那是因为另一个因素。
【解决方案2】:

您应该在操作完成后立即关闭连接。尝试在尽可能短的时间内打开连接。 但是最好使用 using,即使出现异常,它也会调用 Dispose 方法。

using (SqlConnection conn= new SqlConnection(conStr))
{
     //etc...
}

1)打开连接

2)访问数据库

3)关闭连接

 //conn.Open();

        try
        {
          conn.Open();
          //Your Code

        }
        finally
        {
           conn.Close();   
           conn.Dispose();//Do not call this if you want to reuse the connection
        }

【讨论】:

  • 如果try里面有问题就不会关闭连接...close应该在finally中,也就是说conn需要在try之外声明。
猜你喜欢
  • 2016-01-07
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多