2009-08-10 56 views
2

我正在使用企业库4.1。EntLib IDisposable转换

虽然我通过使用执行的代码:

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

我收到以下错误:在使用语句中使用

Microsoft.Practices.EnterpriseLibrary.Data.Database类型必须隐式转换为System.IDisposable

这里有什么使用陈述的确切问题是什么?

回答

2

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

使用“语句”包装对象创建代码可确保在“使用”块退出时处理创建的对象。它只对实现IDisposable的对象有意义,因为其他类型不能被明确处理。

您可以安全地删除您的使用块,并与该结束了:

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

如果DbCommand和实现IDisposable(我不知道,从来没有使用过EntLib的DAAB),那么你可能想包装只是一部分的在使用块的代码:

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

DbCommand是否实现IDisposable – Coops 2014-06-27 13:08:16

1

Microsoft.Practices.EnterpriseLibrary.Data.Database不实现IDisposable,这对于using statement的要求。

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

+0

哦!我想知道...那么垃圾收集如何为EntLib 数据库? – user146584 2009-08-10 01:29:57

+0

与任何其他管理对象一样,垃圾收集将在数据库上工作。当其不再使用时,它将在正常的GC处理过程中收集。 我无法从您的代码段中的_db声明。通过变量名,我会假设在课堂上。如果是这样,那么_db应该在其声明的类不再被引用后的某个时候收集。 DbCommand是您希望在不再需要时尽快释放的对象,因此“使用”语句绝对适合它。 – 2009-08-10 12:32:04