我正在使用企业库来查询我的数据库。当我运行查询时,我依赖于存储过程。目前,我使用的代码如下所示:
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而关闭和处理吗?
谢谢!
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
块确保读取器将被处理。
但是,您也应该处理命令和连接对象。如果不这样做,它们将不会被关闭,直到垃圾收集器来删除它们,因此数据库连接将保持打开状态。如果打开了很多连接,数据库最终会拒绝新的连接。