【发布时间】:2010-09-13 13:29:08
【问题描述】:
我经常使用看起来像这样的模式。我想知道这是否可行,或者是否有我没有在这里应用的最佳实践。
我特别想知道;在抛出异常的情况下,我在 finally 块中的代码是否足以确保正确关闭连接?
public class SomeDataClass : IDisposable
{
private SqlConnection _conn;
//constructors and methods
private DoSomethingWithTheSqlConnection()
{
//some code excluded for brevity
try
{
using (SqlCommand cmd = new SqlCommand(SqlQuery.CountSomething, _SqlConnection))
{
_SqlConnection.Open();
countOfSomething = Convert.ToInt32(cmd.ExecuteScalar());
}
}
finally
{
//is this the best way?
if (_SqlConnection.State == ConnectionState.Closed)
_SqlConnection.Close();
}
//some code excluded for brevity
}
public Dispose()
{
_conn.Dispose();
}
}
【问题讨论】:
-
呃...你为什么要在关闭连接之前检查它是否已经关闭?如果你要在唯一使用它的方法中关闭它,为什么要使用类成员来存储连接?
-
spoon16 包含短语“//为简洁起见排除了一些代码”。由此,我推断这不是唯一使用它的方法。
-
正确,这绝对是我能想到的最简单的例子。我认为由于连接池,我不需要尝试将 SqlConnection 对象存储在每个方法的范围之外。因此,只需按照其他建议使用 USING。
-
关于“Finally”部分,(尽管已经指出根本没有必要)您需要检查对象是否为空。您不能在空对象上调用 .close
标签: c# .net sql sqlconnection