DataSet和DataReader问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataSet和DataReader问题相关的知识,希望对你有一定的参考价值。

我要做一个网站,读取数据是选用DataSet还是用DataReader?哪个好, 因为我实体类有表类型,如果用DataSet的话不能对应它们的关系, 如: private int iD; private UserInfo userID; 这里面的UserInfo是一个实体类类型, 对应的就是一个数据表, 如查用DataReader的话,返回的是一个List集合, 想请问一下大家该怎么选择?请详细回答一下, 还有就是一个项目读取数据是用DataSet和DataReader中的一种,还是两个都要用到?

参考技术A 如果一次性读取的数据量较大建议使用DataSet,DataSet读取之后占的是内存空间,但是现在一般的电脑都有1G以上的内存,所以这点内存算不了什么。完全可以忽略。如果使用DataReader可能会导致网站读取数据的时候
出现假死现象。(千条以上)
如果是少量数据
建议使用DataReader,读取速度较快。让用户体验的舒服些。

由于...,DataSet 是不是比 DataReader 慢?

【中文标题】由于...,DataSet 是不是比 DataReader 慢?【英文标题】:Is DataSet slower than DataReader due to...?由于...,DataSet 是否比 DataReader 慢? 【发布时间】:2010-11-12 00:16:07 【问题描述】:

DataSets 在从数据库中检索数据时可能比DataReader 慢 10 倍以上。我认为这是由于DataSets 必须处理关系等的开销。但是DataSetsDataReader 之间的速度差异是由于DataSets 必须从DB,还是由于应用程序必须进行更多处理,或两者兼而有之?

我假设 DataAdapter 在后台使用 DataReader,因此应用程序需要执行的命令数才能检索 100 行 DataAdapter 等于或大于应用程序需要执行的命令数,如果这些100 行由DataReader 直接检索。 DataReader 是一次检索一行还是一次检索一个字段(特定行的)?

【问题讨论】:

你怎么知道 DataSets 比 DataReaders 慢 10 倍?即使接近这个数字,我也没有测量出任何差异,更像是 +/- 5% 的差异。 你有那个“10x”的参考或证据吗? 不管细节如何,一般来说,DataReader 通常会快很多(根据我的经验,如果您的查询实际上返回许多行,几乎总是超过 5% - 否则没关系无论如何)。我不确定为什么 DataSet 慢得多,我想这是一个合理的问题。 我已在以下链接阅读:devx.com/vb2themax/Article/19887/1954?pf=true 【参考方案1】:

在 DataReader 上使用 DataSet 时可能会出现一些不同类型的开销:

DatSet 包含包含数据的 DataTable 对象,其中包含 DataRow 对象。创建所有对象的开销很小。每个 DataRow 都将其所有值视为对象,因此任何值类型都被装箱,这为每个字段增加了一些开销。

当您使用 DataAdapter 填充 DataSet 时,很容易获得大量您不会使用的数据。如果您不指定所需的字段,即使您不会全部使用它们,您也会获得所有字段。如果您不过滤查询,则会从表中获取所有行。即使您稍后使用 DataTable 上的 DataView 过滤它们,您仍然可以从数据库中获取它们。使用 DataReader,您更接近于获取数据的查询,因此与您在结果中获得的内容之间的联系更加明显。

如果您将数据提取到 DataSet 中的多个 DataTable 对象中,并使用关系让 DataSet 组合数据,那么您可以让 DataSet 完成您本可以让数据库完成的工作,这对其进行了更优化。

如果你很好地使用了 DataSet,开销也不会那么糟糕,而是 30% 而不是 1000%。

假设 DataAdapter 使用 DataReader 是正确的。如果你小心使用 DataAdapter,那么数据库操作本身就和你自己使用 DataReader 一样。

DataReader 将一次从底层数据库驱动程序获取一条记录,而该驱动程序又将一次从数据库中获取一个充满记录的缓冲区。如果记录非常大,一次可能只有一条记录可以放入缓冲区,但缓冲区中通常有数十条记录,如果它们真的很小,甚至有数百条记录。

【讨论】:

【参考方案2】:

MSDN上的几点建议:

Benchmarks DataSet vs. DataReader Working with DataReaders, DataSets, DataAdapters, and DataViews

【讨论】:

【参考方案3】:

DataReader 类似于旧的 ADO 概念,即只进记录集。只进记录集不需要维护任何类型的指针信息,因此总是比传统的DataSet 实例快。因此,DataReader 不会缓存任何数据,需要打开与数据库的连接才能获取底层数据。

这解释了为什么您需要为DataReader 编写以下代码:

DataReader reader = GetANewDataReaderInstance();
while (reader.Read())

    ...

现在与DataSet 相比,情况发生了很大变化。本质上,您可以将数据库模式的子集拉入DataSet,例如表关系、删除和更新规则,当然,当您将数据提交到数据存储时,自动重新填充数据集中的行。 DataSets也可以进行“断连”操作,即可以获取所需数据并关闭数据库连接。

总结 然而,所有这些功能都是有代价的:如果您希望尽快填充自定义业务对象,请使用DataReaders,否则请使用DataSets。

【讨论】:

【参考方案4】:

对您在 Internet 搜索中找到的内容要非常小心。您发布的文章说

使用 .NET 的候选版本之一

编写的 VB.NET 应用程序

那是大约七年前的事了!

请务必查看更新的内容:

New DataSet Features in ADO.NET 2.0 Asynchronous Command Execution in ADO.NET 2.0

【讨论】:

【参考方案5】:

阅读 Scott Mitchell 的 Why I Don't Use DataSets in My ASP.NET Applications。我认为它涵盖了您感兴趣的重点。

【讨论】:

那篇文章展示了一个令人难以置信的图表,该图表展示了随着结果数量从 100 增加到 1000 的数据集从 1 秒攀升到 10 秒。坦率地说,这不太可能。【参考方案6】:

我更喜欢使用 DataReader 来填充列表。

您可以通过一些好的 cmets/answers 查看我最近提出的问题:

Datasets

【讨论】:

以上是关于DataSet和DataReader问题的主要内容,如果未能解决你的问题,请参考以下文章

Datareader、DataAdapter、Dataset、DataView 的区别

DataReader和DataSet的异同之处。

DATASET 和 DATAREADER区别

DataReader和DataSet的异同

DataReader/DataSet区别 ?

datareader和dataset的异同