我正在尝试了解DbConnection和DbCommand,以及在使用后处理这些对象的正确方法。
以下是我的代码段。 通过在DbConnection和DbCommand上使用“using statement”,它就足够了吗?我试图防止可能的内存泄漏。
第二个问题,
我是否必须处理DbCommand对象?
非常感谢
DbProviderFactory fac = DbProviderFactories.GetFactory(this.DatabaseProviderName);
using (DbConnection dbConn = fac.CreateConnection())
{
dbConn.ConnectionString = this.ConnectionString;
using (DbCommand comm = fac.CreateCommand())
{
comm.CommandText = "select * from aTable";
comm.Connection = dbConn;
DataTable targetTable = new DataTable();
DbDataAdapter facDA = fac.CreateDataAdapter();
facDA.SelectCommand = comm;
facDA.Fill(targetTable);
//assuming Adapter would open / close connection (right assumption?)
//do something with the datatable
}
}
答案 0 :(得分:6)
using
的与try/finally
中调用dispose()
的{{1}}块相同。
finally
应在DbCommand
语句中包含,因为它实现了using
。
请注意,IDisposable
实际上是一个抽象类,因此您需要
DbCommand
)IDbCommand
。 SqlCommand
也是一个抽象类,所以你需要做一些类似我上面提到的类似DbConnection
的事情。
一般建议如果一个对象实现DbCommand
,它应该包含在using
语句中,以便调用IDisposable
来释放资源,即使抛出异常也是如此在语句块中。在您的示例中,一个好的做法是将每个连接,命令,Dispose()
和DataTable
对象包装在DbDataAdapter
语句中。
答案 1 :(得分:1)
是的,我会在DbCommand对象上调用Dispose。通常,规则应该是如果它实现了IDisposable,则应在适当时调用其Dispose方法。你的代码看起来很好。我认为你走在正确的轨道上。
编辑实际上,您可能还希望将DbDataAdapter包装在using语句中,因为它也实现了IDisposable。
答案 2 :(得分:1)
将using
块中的对象包裹起来应该足够了;即使抛出异常,这也会使代码调用Dispose
。
是的,您应该为DbCommand
对象以及DbDataAdapter
和DataTable
执行此操作。他们(直接或间接)实施IDisposable
。