企业库- c#阅读器处理审查

本文关键字:处理 审查 企业库 | 更新日期: 2023-09-27 17:53:14

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

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;

如何确定阅读器已关闭?我注意到我的应用程序有时在后续加载时无法加载。我怀疑有什么东西被遗漏了。但我不知道怎么找到它。

根据上面显示的代码,reader不应该因为using而关闭和处理吗?

谢谢!

企业库- c#阅读器处理审查

reader保证是关闭的,因为它被封装在using中。然而,DbCommand也实现了IDisposable,并且没有使用/dispose调用。

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

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

reader正在被处理和关闭,但是DbCommand没有。你应该把它放在using语句中

您处理好了阅读器。您没有处理好DbCommand和Database对象的处理。不确定它们是什么,但很确定它们也实现了IDisposable。他们总是这样。使用语句以你所知道的最漂亮的方式嵌套

一个不太明显的例子是:

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

在c# IDE中得到了很好的支持,它可以正确地缩进。或者直接说出来,程序员写代码的标志就是让所有人都明白:"哇,这家伙不用工具也知道他的东西。"很好。

由于您在using块中使用IDataReader,因此当它超出作用域时,它保证被处置(因此关闭)。正如另一个海报提到的,不要忘记把你的DbCommand也放在using块中,这样它就能被正确地处理。

是的,using块确保读取器将被处理。

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