将 DataReader 重新用于另一个连接

Posted

技术标签:

【中文标题】将 DataReader 重新用于另一个连接【英文标题】:Re-using DataReader for another connection 【发布时间】:2013-09-01 23:06:00 【问题描述】:

我的任务是保存DataReader 的状态,以便另一个连接到同一基地。

我的数据库中有很多表。其中一个始终是只读的,另一个允许修改。我想创建DataReader,它将在打开相同连接后在最近的位置重新打开。我需要根据只读表格内容修改其他表格,并且每次搜索都从最近的行开始。

我的只读表非常大,使用DataReader 使我的程序快得多。我正在寻找SQL ServerDAOOracle 的解决方案。

编辑:实际上它可能仍然是同一个连接,但我需要交替读取和写入不同的表。

【问题讨论】:

把你的数据阅读器的内容放到数据表中,使用数据表 正如我所说:我的只读表真的很大。它的大小可以达到许多 GB。将其存储在 RAM 中是不可接受的。 一个连接用于读取,另一个用于写入选项?您可以让读取连接及其数据读取器保持打开状态。 C.Eveinhuis:由于 SQLServer 和 Oracle 支持多个连接,DAO 不支持。 SQLServer 和 Oracle 通常在更好的机器上运行,因此节省内存并不是那么重要。它不能解决 DAO 连接的问题。 【参考方案1】:

只要连接打开并且数据读取器没有到达执行查询的最后一行,DataReader.Read() 就会读取下一行。但是当连接关闭时,底层的数据读取器也将关闭,因此,您将需要再次执行查询,并且您将在第 1 行开始迭代。

满足您的需求的一种可能方法是在表中创建一个布尔字段来指示光标位置。然后调整您的查询,从该字段设置为 true 的行开始。

【讨论】:

要添加到您的答案中,如果该表具有增量 Id(或日期时间),您可以将 WHERE Id > @last_id 添加到连续的 SELECTs,从而无需遍历已处理的记录。

以上是关于将 DataReader 重新用于另一个连接的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中不使用 ODBC.DataReader 将数据传递给另一个类

DataReader和DataSet的异同之处。

使用多个 Datareader 连接进行批处理

DataReader相关知识点

DataReader和DataSet的异同

错误:已经有一个与此命令关联的打开DataReader,必须先关闭它。多个用户