在没有“finally”的情况下释放SqlConnection

时间:2010-03-03 04:43:31

标签: c# ado.net

我有一个维护c#项目的任务,我发现了一些像这样的代码:

try{ 

    conn.Open(); 
    ... 
    conn.Close(); 
}catch(Exception e){ 

    conn.Close(); 
}

我知道关闭SqlConnection的通常方法是try-catch-finally或“using”关键字,但我发现我无法证明上面的代码是错误的,我找不到任何连接的情况泄密。

那么你可以给我一些技术建议(不是编程风格)吗?谢谢

9 个答案:

答案 0 :(得分:8)

您无法找到任何情况?那个...代码何时包含return语句呢?在一个循环中,continuebreak也适合该帐单。

您的特定代码显然不包含任何控制流语句,但这不是重点。关键在于,当您使用常见的资源获取习惯用法时,例如try-finally和using,您不再需要担心其余代码是什么。 ...可以是一行或一百行;如果你做得对,你在顶部获得的任何资源都会在底部被释放。而不是花时间试图想出其他可能正确的方法(并且必须证明它),使用知道正确的方式,因为它们被设计为正确

此外,即使您可以证明代码永远不会泄漏连接,但conn.Close()仍然是一个糟糕的想法,它必须解决每个可能的异常,您的程序可以永远扔掉。不要捕获您不知道如何解决的异常。

答案 1 :(得分:4)

连接是IDisposable,因此请用using语句包装:

using(conn) {
  ...
}

它应该为您提供最好的保险。它甚至应该关闭连接,如果你return使用块(正确提到,通常是一个隐藏的问题)。

答案 2 :(得分:3)

如果

conn.Close();

抛出异常。

答案 3 :(得分:2)

我会稍微改变一下这个问题。我更喜欢usingtry / finally,因为它避免了冗余。为了与DRY principle保持一致,我宁愿不记得两次致电Close()。避免这种情况使代码更易于编写和维护。除此之外,其他答案也要考虑好点。

答案 4 :(得分:1)

终止conn.Open()和ExecuteNonQuery()调用之间的连接,我认为应该抛出异常,从而泄漏连接对象。

答案 5 :(得分:1)

完美的代码就在这里......

            try
            {
                if (Conn.State == ConnectionState.Closed)
                    Conn.Open();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message + " : dbOperation.ExecuteNonQuery()");
            }
            finally
            {
                 if (Conn.State == ConnectionState.Open)
                    Conn.Closed();
            }

谢谢

答案 6 :(得分:0)

    try
    {
        connection.Open();
        // other codes

    }
    catch (Exception Ex)
    {

        // Create a (useful) error message
        string ErrorMessage = "A error occurred while trying to connect to the server.";
        ErrorMessage += Environment.NewLine;
        ErrorMessage += Environment.NewLine;
        ErrorMessage += Ex.Message;

        // Show error message (this = the parent Form object)
        lblMessage.Text = "Error: " + ErrorMessage;

    }
    finally
    {
        // close connection
        if (connection != null)
        {
            connection.Close();
        }
    }

答案 7 :(得分:0)

以上代码相当于

try{ 

    conn.Open(); 
    ... 
}catch(Exception e){     
}finally{
    conn.Close(); 
}

所以应该没有泄漏。我个人更喜欢最后的方式。

答案 8 :(得分:-2)

try
{
    if (conn.State == ConnectionState.Closed)
    conn.Open();
    ..........
    conn.Close();
}
Catch{}
相关问题