【问题标题】:C# + Disposing DbConnection and DbCommand and catching errorC# + 处理 DbConnection 和 DbCommand 并捕获错误
【发布时间】:2011-01-29 06:25:23
【问题描述】:

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

以下是我拥有的代码 sn-p。 通过在 DbConnection 和 DbCommand 上使用“使用语句”,就足够了吗?我试图防止可能的内存泄漏。

第二个问题,

我必须 Dispose 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
     }
}

【问题讨论】:

    标签: c# dbconnection


    【解决方案1】:

    使用using 与在finally 中调用dispose()try/finally 块相同。

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

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

    • 从中派生
    • 接口代码 (IDbCommand)
    • 使用预定义的派生类之一,例如SqlCommand

    DbConnection 也是一个抽象类,因此您也需要像我在上面为DbCommand 建议的那样做类似的事情。

    一般的建议是,如果一个对象实现了IDisposable,它应该被包装在一个using 语句中,这样Dispose() 就会被调用来释放资源,即使在语句块中抛出了一个异常。在您的示例中,一个好的做法是将每个连接、命令、DataTableDbDataAdapter 对象包装在 using 语句中。

    【讨论】:

      【解决方案2】:

      是的,我会在 DbCommand 对象上调用 Dispose。一般来说,规则应该是,如果它实现了 IDisposable,你应该在适当的时候调用它的 Dispose 方法。您的代码在我看来格式正确。我认为你在正确的轨道上。

      编辑实际上,您可能还希望将 DbDataAdapter 包装在 using 语句中,因为它也实现了 IDisposable。

      【讨论】:

        【解决方案3】:

        将对象包装在using 块中就足够了;即使抛出异常,这也会使代码调用Dispose

        是的,您应该为DbCommand 对象以及DbDataAdapterDataTable 这样做。他们都(直接或间接)实现IDisposable

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多