10

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

        conn.Open();

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

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

我不明白如何使用上面的代码让连接在打开时徘徊。是不是应该打开后总是关闭连接,使上述异常不可能发生?

4

2 回答 2

14

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

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

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

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

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

    conn.Open();

    try
    {

    }
    catch
    {

    }
    finally
    {
        conn.Close();
    }
于 2013-09-30T08:14:14.007 回答
2

您应该在操作完成后立即关闭连接。尝试在尽可能短的时间内打开连接。但是,最好使用它来调用 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
        }
于 2013-09-30T08:32:43.327 回答