代码之家  ›  专栏  ›  技术社区  ›  Vivek

使用后是否需要处理dbcommand?

  •  12
  • Vivek  · 技术社区  · 15 年前

    我们使用Enterprise Library 3.0访问Oracle数据库(Microsoft Oracle客户端)。 如果在调用存储过程或函数之后不释放dbcommand实例,会发生什么情况?.NET是否自动垃圾收集它们? 注意,我们确实要确保事务/连接被关闭并被正确地处理。

    4 回复  |  直到 15 年前
        1
  •  18
  •   Scott Ivey    15 年前

    这是副本,但我没有时间找到原件。

    如果它实现了IDisposable,并且您创建了它,那么您需要对它调用Dispose。这就是类的开发人员使它实现IDisposable的原因。

    垃圾收集器不会对所有IDisposable实现对象调用Dispose。

        2
  •  7
  •   Jeremy Frey    15 年前

    反射镜没有显示 OracleCommand 具体重写Dispose(从 System.ComponentModel.Component 无论如何,它的实现),所以如果您不调用它,它可能不会对您的应用程序造成太大的伤害。

    不过,重要的是 奥拉克曼 具体实施 IDbCommand ,具体实施 IDisposable . 如果你更换过 奥拉克曼 与另一 命令接口 ,那么您很可能希望使用 Dispose() . 而同时 SqlCommand 不显式重写 处置() ,ODBC和OLEDB当然可以。

    简而言之,因为 不可分的 你应该处理掉它,只是为了安全起见。

        3
  •  4
  •   Mike Hofer    15 年前

    从文档中 IDisposable :

    此接口的主要用途是释放非托管资源。当不再使用托管对象时,垃圾收集器会自动释放分配给该对象的内存。但是,无法预测何时将发生垃圾收集。此外,垃圾收集器不了解非托管资源,如窗口句柄或打开的文件和流。

    使用此接口的Dispose方法与垃圾收集器一起显式释放非托管资源。当不再需要对象时,对象的使用者可以调用此方法。

    给定此,实现 不可分的 可能保留对的引用 非受管的 资源。在垃圾收集器出现并收集对象之前,不会释放这些资源。但是,由于您不知道垃圾收集器何时执行此操作,因此可释放对象(例如 OracleDbCommand )可能比你想让他们呆的时间长得多。

    如果对象实现 不可分的 应该 尽快调用它以释放它所持有引用的非托管资源。这可以通过调用 Dispose 直接或通过在using块中声明它。

        4
  •  1
  •   Matthew Groves    15 年前

    不完全确定Oracle,但在使用sqlcommand时,必须在使用后将其释放。您可以直接调用.dispose(),也可以将其放入using块中,如下所示:

    
    using(DbCommand cmd = new DbCommand(foo, bar))
    {
         // use cmd object
    }