哪个更好:DataSet 还是 DataReader?

Posted

技术标签:

【中文标题】哪个更好:DataSet 还是 DataReader?【英文标题】:What's better: DataSet or DataReader? 【发布时间】:2010-11-08 03:58:12 【问题描述】:

刚看到这个话题:Datatable vs Dataset 但这并没有解决我的疑问..让我更好地解释一下,我正在与数据库进行连接,需要在 GridView 中显示结果。 (我之前在使用 VB6 时使用了 RecordSet,DataSet 与它非常相似,因此使用 DataSet 更容易。) 然后一个人告诉我 DataSet 不是最好的方法..

那么,我应该“学习” DataReader 还是继续使用 DataSet ?数据表? 有什么优点/缺点?

【问题讨论】:

【参考方案1】:

DataReader 用于从数据库中检索只读和只进数据。它一次只能读取一行并且只能向前读取,不能向后/随机读取。 DataReader 无法将数据更新/操作回数据库。它从单个表中检索数据。由于它是连接架构,只要连接存在,数据就可用。 DataSet 是内存中的表。它是断开连接的架构,自动打开连接并将数据检索到内存中,完成后关闭连接。它一次将所有数据从数据源提取到其内存中。 DataSet 有助于从多个表中获取数据,它可以来回/随机/随机获取。DataSet 可以更新/插入/操作数据。

【讨论】:

【参考方案2】:

数据读取器与数据集

1) - DataReader 是在面​​向连接的架构中设计的 - DataSet 是在断开的架构中设计的

2) - DataReader 提供对数据的只进访问 - DataSet 为数据提供可滚动导航

3) - DataReader 是只读的,我们无法更改它下面的数据 - DataSet 是可更新的,我们可以对其下存在的数据进行更改并将这些更改发送回数据源

4) - DataReader 不提供数据搜索和排序等选项 - DataSet 提供数据的搜索和排序等选项

【讨论】:

【参考方案3】:

本质上是:“哪个更好:桶还是软管?”

DataSet 是这里的桶;它允许您携带一组断开连接的数据并使用它 - 但您将承担携带存储桶的成本(因此最好将其保持在您喜欢的大小)。

数据读取器是软管:它提供单向/一次性访问数据,因为它飞过您;您不必一次携带所有可用的水,但需要将其连接到水龙头/数据库。

就像你可以用软管填充桶一样,你可以用数据读取器填充DataSet

我想说的是,他们做不同的事情......

我个人不经常使用DataSet - 但有些人喜欢它们。但是,我确实使用数据读取器进行 BLOB 访问等。

【讨论】:

@Marc,很好的比喻。当您不使用 BLOB 时,您使用哪种数据访问方式? @Ash - 通常是 LINQ-to-SQL、SqlBulkCopyIDataReader非常很少,DataTable。实际上大约两次(曾经)。 最近还有“dapper” :)【参考方案4】:

进一步Marc's 点:您可以使用完全没有数据库的DataSet。

您可以从 XML 文件或仅从程序中填充它。用一个数据库中的行填充它,然后转身将其写入另一个数据库。

DataSet 是关系模式的完全内存表示。是否将它与实际的关系数据库一起使用取决于您。

【讨论】:

仅作记录,数据读取器也是如此 - 请参阅“CsvReader”、“DataTableReader”等。为了将其推回数据库,SqlBulkCopy(作为示例)将与DataTable 或 IDataReader。【参考方案5】:

要回答您的第二个问题 - 是的,您应该了解 DataReaders。如果有的话,那么您了解如何使用它们。

我认为在这种情况下你最好使用 DataSets - 因为你正在做数据绑定和所有工作(我在想 CPU 周期与人力)。

至于哪一个会提供更好的性能。这在很大程度上取决于您的情况。例如,如果您正在编辑要绑定的数据并批量处理更改,那么使用 DataSet 会更好

【讨论】:

【参考方案6】:

这取决于您的需求。最重要的区别之一是 DataReader 将保留与数据库的打开连接,直到您完成它,而 DataSet 将是内存中的对象。如果将控件绑定到 DataReader,那么它仍然是打开的。此外,DataReader 是一种只能向前读取无法操作的数据的方法。使用 DataSet,您可以在您认为合适的时候来回移动和操作数据。

一些附加特性:DataSet 可以序列化并以 XML 表示,因此可以轻松地传递到其他层。 DataReader 不能被序列化。

另一方面,如果您要从数据库中读取大量行,然后将这些行交给某个业务规则的某个进程,则 DataReader 可能更有意义,而不是加载包含所有行的 DataSet,占用内存并可能影响可扩展性。

这是一个有点过时但仍然有用的链接:Contrasting the ADO.NET DataReader and DataSet。

【讨论】:

链接已损坏。请修复或删除它。【参考方案7】:

不同的需求,不同的解决方案。

正如您所说,数据集与 VB6 Recordset 最相似。也就是说,拉下你需要的数据,传递它,随心所欲地使用它。哦,然后在你完成后最终摆脱它。

Datareader 受到更多限制,但当您只需要读取一次数据时,它会提供更好的性能。例如,如果您自己填充网格 - 即提取数据,遍历它,为每一行填充网格,然后丢弃数据 - datareader 比 dataset 要好得多。另一方面,如果您有任何更新数据的意图,甚至不要尝试使用 datareader...

所以,是的,学习它 - 但只在适当的时候使用它。数据集为您提供了更大的灵活性。

【讨论】:

感谢 AviD 和 Ahmad Mageed 的快速回复。这会让我思考(n'学习)很多! :)

以上是关于哪个更好:DataSet 还是 DataReader?的主要内容,如果未能解决你的问题,请参考以下文章

哪个最常用? RSS 还是 Atom?哪个更好?

PigServer 还是 PigRunner?哪个更好?

哪个 Silverlight Control Set 更好? Telerik 还是 ComponentArt? [关闭]

哪个更好,number(x) 还是 parseFloat(x)?

性能方面哪个更好:对象原型还是构造函数本机函数? [复制]

用啥? time() 函数还是 $_SERVER['REQUEST_TIME'] ?哪个更好?