【发布时间】:2009-10-16 14:24:55
【问题描述】:
所以我没有看到我的问题的答案:
ADO 与 DataSet 之间是否存在差异(性能或其他方面)?如果有,哪个更常见?
【问题讨论】:
-
我认为数据集是历史,现代的做法是使用实体模型。 ADO 提供底层接口来连接数据库系统。实体模型是非常高级的抽象级别。
所以我没有看到我的问题的答案:
ADO 与 DataSet 之间是否存在差异(性能或其他方面)?如果有,哪个更常见?
【问题讨论】:
ADO 是您实际获取数据的方式。
我认为你在这里搞混了。
数据集基本上是您刚刚提取的数据在内存中的表示形式,对于较小的结果集是可以的,但对于任何大的结果集都应该避免。
编辑:
还想添加,对于更大的结果集,通过 Datareaders 填充的通用列表将在性能方面为您提供帮助。
举个关于数据集的例子,我不得不重写一份运行时间超过 9 小时的报告。这是一个生成 CSV 的控制台应用程序。无论如何,程序员将 140 万条记录加载到数据集中,然后对每一行执行一个 for each 循环。这不仅需要将近 10 个小时,而且在运行时会占用 4 GB 的内存。
删除数据集后,报表现在可以在 5 分钟内运行,并占用大约 20 兆内存。
只是一个例子。
【讨论】:
ADO / ADO.Net 是一种将数据输入或输出数据库的方法。
数据集是一种携带数据的方式。
它们不是相互排斥的
【讨论】:
您的问题似乎有点奇怪,因为您要求比较 ADO 与 DataSet(ADO.NET 中的一个类)。如果您要求比较 ADO 与 ADO.NET 或比较 ADO 的 RecordSet 对象与 ADO.NET 的 DataSet 对象,这将更有意义。我会像你这样问一样回答。
首先,看这里:
这是一篇 Wikipedia 文章,详细介绍了这两种技术之间的主要区别。
ADO.NET 的DataSet 最大的一个特点是可以将其视为一个完整的内存数据库。诚然,它可能主要用于检索单个查询或表的数据价值,但是,它可以包含多个表以及这些表之间的一组完整的关系和约束(就像 RDBMS 本身中存在的那样!)。 DataSet 也是一个 disconnected 对象。这意味着从 RDBMS 系统检索数据,填充DataSet,然后可以关闭数据库连接。完整的DataSet 然后可以在函数、类和组件等之间的内存中传递,甚至可以在保留“在内存中”的同时对其应用一个或多个更新。然后,整个DataSet 可以在重新建立数据库连接后有效地“一次性”轻松地持久化回原始数据存储/RDBMS。这允许数据在内存中存在很长时间,而不必像数据库连接那样“保持开放”和昂贵(且稀缺)的资源。
相比之下,ADO 的RecordSet 主要是单个表的表示(就像只查看数据库中的一个表,而不是整个数据库本身)。它也是一个“已连接”对象,这意味着虽然您在内存中有一个填充的RecordSet,并且您(例如)迭代它的记录,但您仍然连接到后端数据库。如果您的程序中的工作需要一些时间,您将保持该数据库连接打开(可能)相当长一段时间。
如果您正在寻找两种技术(ADO 与 ADO.NET)之间的性能比较,您可以在此处找到这样的比较:
PERFORMANCE COMPARISON OF MICROSOFT'S COM ADO AND ADO.NET DATABASE CONNECTORS
【讨论】:
ADO.NET DataReader 比使用 DataSet 更快,因为它没有创建 DataSet 操作所需的大量内部对象的开销。例如,DataTable 可以缓存其数据。
但是,在正确的上下文中使用 DataSet 有一些好处。 如果性能是您的主要目标,那么使用 ADO,否则我建议使用 Typed DataSets。
【讨论】:
ADO 是从数据库中检索数据的机制/代码。几乎所有的数据库发送和检索操作都使用 ADO。
DataSets 和 Datatables 是在数据库和应用程序之间传输数据的媒介(或类)。
除非它是一次性应用程序,否则我会避免使用 DataSets/DataTables。 Explanation为什么。
【讨论】:
我想你可能想知道ADO.NET using DataSet和ADO.NET using DataReader之间的区别一般状态!
这里有区别:
DataReader 提供更快的性能,但具有只读和只进访问权限。
DataSet,另一方面,是高资源消耗,但提供更多的控制和断开连接的性质。
【讨论】: