2010-07-08 88 views
1

我需要通过DataReader迭代两次。有没有办法做到这一点,而不使用数据集,并没有运行两次查询?顺便说一句,我正在使用C#。
谢谢通过DataReader迭代两次

+0

你为什么试图避免数据集?如果这是性能问题,您可以查看DataRow对象上的ItemArray。使用它而不是使用列索引器可以更快。 – 2010-07-08 20:42:19

+0

这是几十万行。我会研究,谢谢! – Pascal 2010-07-09 15:10:48

回答

2

简短的答案是否定的,你运行结果集的枚举,然后你就完成了。应该做的是将结果转储为某种简化的原始结果,您可以尽可能多地进行迭代(避免DataSet的开销)。

如果你看一下MSDN,它会注意到SqlDataReader是“仅向前”,这将再次表明这是不可能的。

+0

我知道它只是向前...我只是认为可能有一些方法来解决它,但谢谢! – Pascal 2010-07-08 20:37:34

0

IDataReader规范不允许列表重置,但检查具体实现还实现IEnumerator或具有GetEnumerator()函数有一个复位命令作为该接口的一部分。

+0

如果Reset方法在该类上工作,并且不会抛出'NotImplementedException',它很可能会重新查询数据库。 – 2010-07-08 20:36:49

2

这是可能的,但并不那么简单,因为数据读取器在每次Read()调用时都会发生变化。所以你需要将以前的值存储在某个地方以便下次访问它。在这里使用数据集并不是什么坏主意。

3

它是一个只读的阅读器,你不能回头。你最好的选择是,不要迭代两次数据读取器,而是在一次迭代中执行你想要做的两个操作。

你可以自己缓存结果,但这就像摧毁DataReader的目的,所以如果你需要多次使用数据,你必须选择另一种方式来访问它。