【问题标题】:EntLib IDisposable conversionEntLib IDisposable 转换
【发布时间】:2009-08-10 01:02:35
【问题描述】:

我正在使用 Enterprise Library 4.1。

当我使用 :

执行代码时
using (  _db = DatabaseFactory.CreateDatabase("NLayerDB") )
{
     DbCommand dbCommand = _db.GetStoredProcCommand("someSPName");
     _db.AddInParameter(dbCommand, "Id", DbType.Int32, id);
     result= _db.ExecuteNonQuery(dbCommand);
}

我收到以下错误:

在 using 语句中使用的Microsoft.Practices.EnterpriseLibrary.Data.Database 类型必须可隐式转换为 System.IDisposable

这里有 USING 语句的确切问题是什么?

【问题讨论】:

    标签: enterprise-library


    【解决方案1】:

    实际使用并没有获得任何东西(正如您所指出的,它实际上不会编译)。

    包装您的对象创建代码“using”语句可确保您创建的对象在“using”块退出时被释放。它只对实现 IDisposable 的对象有意义,因为其他类型不能显式释放。

    您可以安全地删除您的 using 块并得到以下结果:

    _db = DatabaseFactory.CreateDatabase("NLayerDB");
    DbCommand dbCommand = _db.GetStoredProcCommand("someSPName"); 
    _db.AddInParameter(dbCommand, "Id", DbType.Int32, id); 
    result = _db.ExecuteNonQuery(dbCommand); 
    

    如果 DbCommand 实现 IDisposable(我不确定,从未使用过 EntLib 的 DAAB),那么您可能只想将那部分代码包装在 using 块中:

    _db = DatabaseFactory.CreateDatabase("NLayerDB");
    using (DbCommand dbCommand = _db.GetStoredProcCommand("someSPName"))
    {
        _db.AddInParameter(dbCommand, "Id", DbType.Int32, id); 
        result = _db.ExecuteNonQuery(dbCommand); 
    }
    

    【讨论】:

      【解决方案2】:

      Microsoft.Practices.EnterpriseLibrary.Data.Database 未实现 IDisposable,这是 using statement 的要求。

      DbCommand 对象确实实现了 IDisposable,因此在 using 语句中使用它可能更合适。

      【讨论】:

      • 哦!我想知道......那么垃圾收集如何用于 EntLib 数据库?
      • 垃圾收集将像任何其他托管对象一样在数据库上工作。当它不再使用时,它将在正常的 GC 处理过程中被收集。我无法从您的 sn-p 中看出 _db 是在哪里声明的。通过变量名,我假设在一个类级别。如果是这样,则应该在不再引用其声明的类之后的某个时间收集 _db。 DbCommand 是你希望在不再需要时尽快集中释放的对象,所以“using”语句绝对适合它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多