我应该如何跟踪打开的 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何避免 MSSql 2000 中出现错误“已存在与此命令关联的打开 DataReader”