我应该如何跟踪打开的 DataReader?

Posted

技术标签:

【中文标题】我应该如何跟踪打开的 DataReader?【英文标题】:How should I keep track of open DataReaders? 【发布时间】:2009-06-10 18:25:45 【问题描述】:

我的任务是创建一个类,客户可以使用该类从特定数据源获取数据。例如,主要例程将是

IDataReader GetDataReader(DbCommand command);
DataSet GetDataSet(DbCommand command);

我知道数据访问应用程序块可以执行此操作,但我无法使用应用程序块,原因我不会解释。无论如何,我确实打算借用一些逻辑。

但是,我的另一部分任务是跟踪打开的 DataReader。这只是为了验证每个人都正确地关闭了他们的读者。我的计划是在这个新类中只包含一个 DataReader 集合,每次调用 GetDataReader 例程时都会添加这些集合。在应用程序执行结束时,代码将遍历此集合并将警告记录到每个仍打开的阅读器的文件中。

所以,我有两个问题:

    这种设计本身有什么问题吗? 无论如何我可以从 DataReader 中获取 SQL 命令吗?这将大大简化对未封闭阅读器的搜索。或者,我是否必须存储读取器/命令对才能获取此信息?

【问题讨论】:

复制:***.com/questions/941126/… 【参考方案1】:

您是否考虑过将数据访问组件设置为更高级别以强制执行规则?例如,为了执行 get-in-get-your-data-and-get-out-and-close 策略,我们仅从数据访问组件返回数据集和缩放器(我们还执行其他规则,例如仅使用存储过程与数据库交互)。如果调用者真的只需要数据而不需要数据读取器,也许您可​​以从读取器读取数据然后关闭它,因此不必跟踪读取器的状态。

如果您确实有返回 DataReader 的技术需求(并且会有很多),也许您可​​以创建包装类或读取器的子类并返回它而不是返回原始读取器......例如一个 TrackedDataReader。然后,您可以将簿记内置到班级本身中。只是一个想法。

【讨论】:

我们需要灵活地获取 DataReader 和 DataSet。我不确定我理解你的 TrackedDataReader 是什么意思。分发的读者集合将是簿记本身。我想我们说的是同一件事。

以上是关于我应该如何跟踪打开的 DataReader?的主要内容,如果未能解决你的问题,请参考以下文章

将 DataReader 重新用于另一个连接

我应该如何测试从 DataReader 填充列表的方法?

如何解决实体框架打开 DataReader 问题

如何避免 MSSql 2000 中出现错误“已存在与此命令关联的打开 DataReader”

.Net 中 Oracle DataReader 的大性能问题

如何使用 FxCop 自定义规则验证 DataReader 是不是实际关闭?