代码之家  ›  专栏  ›  技术社区  ›  Jose

SqlDataReader/DbDataReader实现问题

  •  3
  • Jose  · 技术社区  · 16 年前

    cmd.CommandText = "SELECT * FROM Customers";
    
    var rdr = cmd.ExecuteReader();
    
    while(rdr.Read())
    {
      //Do something
    }
    

    数据读取器是否在内存中拥有所有的行,还是只获取一行,然后在调用Read时,它是否转到db并获取下一行?似乎仅仅将一个放入内存将是糟糕的性能,但将所有这些放入内存将使调用ExecuteReader需要一段时间。

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

    我只是好奇有没有人有主意。

    2 回复  |  直到 16 年前
        1
  •  5
  •   Rhapsody    16 年前

    如前所述 here

    使用DataReader可以增加 应用程序性能 可用,并且(默认情况下)存储

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

        2
  •  4
  •   GrowlingDog    15 年前

    狂想曲是正确的。

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

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

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

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