C# 连接未关闭,连接';它的当前状态是开放的

C# 连接未关闭,连接';它的当前状态是开放的,c#,asp.net,C#,Asp.net,我正在写一个ASP.NET应用程序。在我的数据层中,一个sql连接在查询前后被打开和关闭。SqlConnection被保留为单个类的私有字段。类中的每个数据库调用都使用相同的结构: conn.Open(); try { // database querying here } finally { conn.Close(); } 然而,在

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

        conn.Open();

        try
        {
            // database querying here
        }
        finally
        {
            conn.Close();
        }
然而,在非常罕见的情况下,我得到的例外是“连接没有关闭”。连接的当前状态为“打开”。不可能重现该问题,因为它很少起源于代码的不同部分。我的应用程序中涉及一些线程,但新线程也会生成新的数据层类,从而生成新的连接对象


我不明白,使用上面的代码,怎么可能有一个连接在打开状态下徘徊。连接是否应该在打开后始终关闭,从而使上述异常无法发生?

很可能在
try
块中抛出了一个您没有处理的异常。有关以下信息,请参见MSDN中的此注释:

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

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

using (SqlConnection connection = new SqlConnection(connectionString))
{
     //etc...
}
或者,将catch块添加到
try finally

    conn.Open();

    try
    {

    }
    catch
    {

    }
    finally
    {
        conn.Close();
    }

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

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

1)打开连接

 //conn.Open();

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

        }
        finally
        {
           conn.Close();   
           conn.Dispose();//Do not call this if you want to reuse the connection
        }
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
        }

这里最重要的是conn对象的实例化位置?另外:使用“using”有什么不对?只需使用using语句即可?这是要关闭和释放的连接。如果可能,请尝试使用(SQLConnection conn=new SQLConnection(xxx)){…}
语句将连接包装在
中,然后查看是否仍然可以重现错误。这样,当代码退出时,SQLconnection会被GC清除,您从哪里得到该异常?在代码张贴?如果没有,您可以发布更多的代码吗?谢谢,这解释了为什么conn.Close()有时不运行。我不知何故相信,不管发生什么,最终{}都会运行。没问题。如果这回答了你的问题,你应该考虑将它标记为帮助其他用户面临类似问题的答案。@ USER 28 30395你是对的,不管发生什么异常,最终块都会执行。如果此答案中的代码解决了问题,那是因为另一个因素。如果try中存在问题,则不会关闭连接。。。close应该在finally中,这意味着conn需要在try之外声明。