我有一个维护c#项目的任务,我发现了一些像这样的代码:
try{
conn.Open();
...
conn.Close();
}catch(Exception e){
conn.Close();
}
我知道关闭SqlConnection的通常方法是try-catch-finally或“using”关键字,但我发现我无法证明上面的代码是错误的,我找不到任何连接的情况泄密。
那么你可以给我一些技术建议(不是编程风格)吗?谢谢
答案 0 :(得分:8)
您无法找到任何情况?那个...
代码何时包含return
语句呢?在一个循环中,continue
和break
也适合该帐单。
您的特定代码显然不包含任何控制流语句,但这不是重点。关键在于,当您使用常见的资源获取习惯用法时,例如try-finally和using,您不再需要担心其余代码是什么。 ...
可以是一行或一百行;如果你做得对,你在顶部获得的任何资源都会在底部被释放。而不是花时间试图想出其他可能正确的方法(并且必须证明它),使用知道正确的方式,因为它们被设计为正确
此外,即使您可以证明代码永远不会泄漏连接,但conn.Close()
仍然是一个糟糕的想法,它必须解决每个可能的异常,您的程序可以永远扔掉。不要捕获您不知道如何解决的异常。
答案 1 :(得分:4)
连接是IDisposable
,因此请用using
语句包装:
using(conn) {
...
}
它应该为您提供最好的保险。它甚至应该关闭连接,如果你return
使用块(正确提到,通常是一个隐藏的问题)。
答案 2 :(得分:3)
如果
conn.Close();
抛出异常。
答案 3 :(得分:2)
我会稍微改变一下这个问题。我更喜欢using
或try
/ 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{}