C#读者处置评论

时间:2011-04-27 23:50:39

标签: c# enterprise-library idatareader

我正在使用Enteprise Library查询我的数据库。当我运行查询时,我依赖于存储过程。目前,我使用的代码如下所示:

Database database = DatabaseFactory.CreateDatabase();
DbCommand command = database.GetStoredProcCommand("MyStoredProcedureName");

database.AddInParameter(command, "filter", DbType.String, filter);

Result result = null;
using (IDataReader reader = database.ExecuteReader(command))
{
  if (reader.Read())
    result = new Result(reader);
}
return result;

我怎样才能确定我的读者被关闭了?我注意到我的应用程序有时无法加载后续加载。我怀疑某些东西是敞开的。但我无法弄清楚如何追踪它。

根据上面显示的代码,由于'使用',读者不应该被关闭和处理吗?

谢谢!

5 个答案:

答案 0 :(得分:2)

读者正在处理和关闭,但DbCommand不是。你也应该把它放在一个using语句中。

答案 1 :(得分:1)

保证读者关闭,因为它包含在using中。但是,DbCommand也会实现IDisposable,并且没有使用/ dispose调用它。

Database database = DatabaseFactory.CreateDatabase();
using(DbCommand command = database.GetStoredProcCommand("MyStoredProcedureName"))
{
    //snip (no change)
}
return result;

读者不代表底层连接,只是用于读取响应的缓冲区。

答案 2 :(得分:1)

你负责处理读者。您没有处理DbCommand和Database对象的处理。不确定它们是什么,非常确定它们也实现了IDisposable。他们总是那样做。以您知道的最漂亮的方式使用语句嵌套

其中一个不太明显的是:

using (var obj = new Foo())
using (var obj2 = new Bar()) {
    // etc..
}

这是C#IDE非常好的支持,它正确地缩进。或者只是明确一点,一个程序员的标志,编写代码使任何人都明白:“哇,老兄知道他没有工具的东西”。那很好。

答案 3 :(得分:0)

由于您在IDataReader块中使用using,因此当它超出范围时,可以保证处理(因此关闭)。正如另一张海报所提到的那样,不要忘记将DbCommand放在一个使用区块中,以便妥善处理。

答案 4 :(得分:0)

是的,using块确保阅读器处理。

但是,您也应该处理命令和连接对象。如果不这样做,它们将在垃圾收集器移除它们之前不会关闭,因此数据库连接将保持打开状态。如果你打开很多连接,数据库最终会拒绝新的连接。