C# + 处理 DbConnection 和 DbCommand 对象的释放以及捕获错误

3

我正在尝试理解DbConnection和DbCommand,以及在使用后正确处理这些对象的方法。

以下是我拥有的代码片段。 通过在DbConnection和DbCommand上使用“using语句”,是否足够?我正在尝试防止可能的内存泄漏。

第二个问题,

我必须释放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
     }
}
3个回答

6

使用usingtry/finally块相同,只是在finally中调用dispose()

DbCommand应该包含在using语句中,因为它实现了IDisposable接口。

请注意,DbCommand实际上是一个抽象类,因此您需要:

  • 从中派生
  • 编写一个接口的代码(IDbCommand
  • 使用其中一个预定义的派生类,例如SqlCommand

DbConnection也是一个抽象类,因此您需要像上面建议DbCommand一样进行处理。

一般建议,如果对象实现了 IDisposable 接口,应该将其包装在 using 语句中,以便在语句块内部抛出异常时调用 Dispose() 方法释放资源。因此,在您的示例中,一个好的做法是将每个连接、命令、DataTableDbDataAdapter 对象都包装在 using 语句中。

1

是的,我会在 DbCommand 对象上调用 Dispose 方法。通常情况下,规则应该是如果它实现了 IDisposable 接口,当适当时应该调用其 Dispose 方法。你的代码看起来很完整,我认为你走在了正确的道路上。

编辑 实际上,你可能还想将 DbDataAdapter 包装在 using 语句中,因为它也实现了 IDisposable 接口。


1

像你所做的那样,在using块中包装对象应该足够了;这将使代码在抛出异常时调用Dispose

是的,你应该对DbCommand对象以及DbDataAdapterDataTable进行这样的操作。它们都(直接或间接地)实现了IDisposable


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接