SqlDataReader/DbDataReader实现问题

SqlDataReader/DbDataReader实现问题,sql,sqldatareader,dbdatareader,Sql,Sqldatareader,Dbdatareader,有人知道DbDataReaders实际上是如何工作的吗。我们可以使用SqlDataReader作为示例 当您执行以下操作时 cmd.CommandText = "SELECT * FROM Customers"; var rdr = cmd.ExecuteReader(); while(rdr.Read()) { //Do something } 数据读取器是否在内存中拥有所有的行,还是只抓取一行,然后在调用Read时,它是否转到db并抓取下一行?似乎只是将其中一个放入内存将是糟糕的性

有人知道DbDataReaders实际上是如何工作的吗。我们可以使用SqlDataReader作为示例

当您执行以下操作时

cmd.CommandText = "SELECT * FROM Customers";

var rdr = cmd.ExecuteReader();

while(rdr.Read())
{
  //Do something
}
数据读取器是否在内存中拥有所有的行,还是只抓取一行,然后在调用Read时,它是否转到db并抓取下一行?似乎只是将其中一个放入内存将是糟糕的性能,但将所有这些放入内存将使调用ExecuteReader需要一段时间

我知道我是这个对象的消费者,他们如何实现它并不重要,但我只是好奇,我想我可能会花几个小时在Reflector上了解它在做什么,所以我想我会问一些可能知道的人

我只是好奇是否有人有想法。

如前所述:

使用DataReader可以增加 应用程序性能 在数据恢复后立即检索数据 可用,并且(默认情况下)存储 内存中一次只能有一行, 减少系统开销


据我所知,这是每个读者在.NET框架中的工作方式。

Rhapsody是正确的。

结果作为查询返回 执行,并存储在 客户端上的网络缓冲区,直到 使用的读取方法请求它们 数据阅读器

我使用DataReaders vs DataAdapters在一个相同的10000条记录数据集上运行了一个测试,我发现DataAdapter始终比DataReader快3-4毫秒,但DataAdapter最终会占用更多内存

当我在相同的50000个记录数据集上运行相同的测试时,我看到DataReader端的性能提高了50毫秒

话虽如此,如果您有一个长时间运行的查询或一个巨大的结果集,我认为您最好使用DataReader,因为您可以更快地得到结果,并且不必在内存中保留所有数据。同样重要的是要记住,DataReader只是向前的,所以如果您需要在结果集中移动,那么它不是最佳选择