数据加载到哪里?

时间:2018-11-02 09:36:37

标签: c# sql .net database ado.net

我注意到许多人不了解如何执行查询以从数据库中检索数据。

通常有如下代码:

var reader = await sqlCommand.ExecuteReaderAsync();
dataTable.Load(reader);

关于StackOverflow,有几个答案,这些答案是将数据异步下载到DataTable

但是,我相信ExecuteReader方法不会加载数据,而只会创建读取器的实例。

我可以通过官方documentation的报价来确认这一点:

  

DataReader提供了无缓冲的数据流,该流允许   高效处理数据源结果的过程逻辑   按顺序。检索时,DataReader是一个不错的选择   大量数据,因为该数据未缓存在内存中。

与我有争议的一个人引用了link,并声称那里正在下载数据。但是我看不到这段代码中对Read方法的调用!同时,下面的ExecuteScalarAsync方法有这样的调用。

因此,数据将通过DataTable.Load方法加载,或通过while(reader.Read())循环完成。我说的对吗?

那么将数据加载到哪里:ExecuteReader(Async)方法还是Read/Load方法中?

1 个答案:

答案 0 :(得分:0)

实际上恢复数据是一个棘手的问题,因为您正在使用DataReader。

DataReader的核心工作类似于Enumerators。 Read()所做的事情可与Current媲美(Current是一个属性,因此它是一个函数调用,看起来并不像)。在这两种情况下,我都无法告诉您数据何时准确传输/已完全内置在内存中。那是一个实现细节。我可以告诉你,当Read / Current返回时,它已经完全恢复了,它是“我完成了”的重新运行值,而不是下一个结果。

如果我从数组构建枚举器,则所有数据已在内存中。而且,这种情况并不罕见,每次调用foreach循环时都会发生! Foreach不适用于集合,仅适用于枚举器。幸运的是,从一个偏斜中获取一个Enumerator非常简单,它是一个隐式转换。

另一方面,枚举数可能是从外部数据源构建的。像Directory.EnumerateFiles()File.ReadLines()。最晚,当调用Current时,下一行将被准确加载。但是,如果代码编写器有些精明,则下一个1-很多结果将在当前调用之间在后台加载。以及它预先加载了多少,甚至可能取决于环境(您必须在此上浪费多少RAM)。如果在调用Current时已经有hte数据,则将其返回。如果不是,则Current成为阻塞调用,直到实际获得下一个结果为止。