我正在使用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;
我怎样才能确定我的读者被关闭了?我注意到我的应用程序有时无法加载后续加载。我怀疑某些东西是敞开的。但我无法弄清楚如何追踪它。
根据上面显示的代码,由于'使用',读者不应该被关闭和处理吗?
谢谢!
答案 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
块确保阅读器处理。
但是,您也应该处理命令和连接对象。如果不这样做,它们将在垃圾收集器移除它们之前不会关闭,因此数据库连接将保持打开状态。如果你打开很多连接,数据库最终会拒绝新的连接。