try
{
OpenConnection();
RowsAffected = cmd.ExecuteNonQuery();
CloseConnection(true); //should I use this function call here
//as well, when I am using it in finally
//block. For closing database connection.
}
catch (SqlException ex)
{ throw ex; }
finally
{ CloseConnection(true); }
或者我应该这样写呢
try
{
OpenConnection();
RowsAffected = cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{ throw ex; }
finally
{ CloseConnection(true); }
答案 0 :(得分:8)
不,无论try
块中的代码是成功还是失败,都会始终执行finally块。在您的第一个示例中,连接将在成功时关闭两次。
您说您正在检查连接状态,这意味着在关闭连接两次时不会出现异常。不过,我认为仅在必要时尝试关闭它更合适。
答案 1 :(得分:1)
在这个特定的例子中,你实际上可以这样做:
using (var conn = new SqlConnection(...)) {
// Do work
}
编译器对该语句的作用基本上是:
SqlConnection conn;
try {
conn = new SqlConnection(...)
} finally {
conn.Dispose();
}
或者左右......始终执行finally块,确保使用块始终调用Dispose。
这种方法的缺点是你无法捕获可能被抛出的SqlException,所以你最终会做这样的事情:
try {
using (var conn = new SqlConnection(...)) {
// Do work.
}
} catch (SqlException ex) {
}
但编译后的代码最终代表:
try {
SqlConnection conn;
try {
conn = new SqlConnection(...);
} finally {
conn.Dispose();
}
} catch (SqlException ex) {
}
老实说虽然它可能不会在性能方面有任何不同,因为每当你抛出异常时,它都会受到性能影响。它确实始终调用Dispose。
答案 2 :(得分:0)
你的finally块总是被执行。使用像Dispose()这样的Close函数,CLose()应该在finally块
中使用答案 3 :(得分:0)
你应该用第二种方式写作
try
{
OpenConnection();
RowsAffected = cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{ throw ex; }
finally
{ CloseConnection(true); }