ADO.NET问题:何时使用DataReader,DataAdapter

9

我想知道,在从数据库中获取数据时,使用DataReader和DataAdapter时需要考虑哪些因素,以及这两者之间的区别是什么,除了DataReader需要打开连接而DataAdapter不需要之外...在我们的项目中,我们在所有的DAL中都使用DataReader,从未使用DataAdapter。所以我想知道,在什么情况下使用DataAdapter + DataTable组合会比使用DataReader更好。谢谢。

7个回答

9

DataReader:当您只想以只读模式获取数据、填充业务实体并关闭读取器时,最好使用它。这真的很快。

比如说,您有一个客户类,想要一个完全初始化的对象,所有客户属性都填好了(例如姓名、地址等)

在这里您将使用DataReader,只需填充实体并关闭读取器即可。

您无法使用DataReader进行更新操作。

DataAdapter:您可以使用DataAdapter读取/更新数据,但是与DataReader相比,读取数据速度较慢。

您可以使用DataAdapter更新数据,但是使用DataReader则不行。


3
我在做ADO.NET相关的工作时,几乎总是更喜欢使用DataReader;原因是它不会强制要求你将数据存储在客户端上的时间超过必要的时间。
这也是何时使用DataAdapter到DataSet/Table的答案; 当您想要将数据存储在客户端上时,可能要以某种方式处理它-通过迭代来回操作或作为集合进行操作,而不仅仅是将值输出到网格中,Reader,在我看来,是更好的选择。

3
DataReader允许您处理每条记录并将其丢弃,这在您想要处理许多没有关系的数据记录时非常有用。例如,当您想要从数据库中的每个记录计算一些复杂的统计值或将许多数据记录保存到本地文件中时,您可能会使用DataReaderDataAdapter则不同,它能够让您在内存中拥有数据记录。这使您可以制作GUI来浏览数据、编辑数据等等。它更通用,但不适用于大型数据集。

数据适配器在将数百万条记录(例如我在数据表中有2-3百万条记录)导入数据库时是否是一个好选择? - Learning-Overthinker-Confused

3
你只有在使用数据集时才需要使用DataAdapter。
Adapter有两个主要方法Fill()Updater(),用于从数据库读取数据集并将其写入其中。

请注意,Fill()会打开连接,使用DataReader获取所有记录,然后关闭连接。

如果没有数据集和数据表,您就没有使用DataAdapters的必要。

所以真正的问题是:您想在DAL中使用什么类型的存储类?数据集是可行且简单的,但它是一种过时的技术(不再改进)。

也许您应该寻找ORM(对象关系映射)库。但这将用一个更复杂的选择替换您的DataReader / Adapter问题。


数据适配器是否是在向数据库中导入数百万条记录(例如,我在数据表中有2-3百万条记录)方面的好选择? - Learning-Overthinker-Confused
2
只要试一试,牵涉到太多因素。此外,请不要在评论中提问,这不是一个论坛。请查找现有的内容,否则使用“提问”按钮。 - H H
你可以帮我解决这个问题吗:http://stackoverflow.com/questions/37970073/getting-error-while-inserting-datatables-records-in-my-database-table - Learning-Overthinker-Confused

2

从不使用DataReader。

因为我严格分层我的应用程序,我的数据访问层(DAL)负责与数据库通信,我的业务逻辑层(BLL)负责构建对象,所以BLL无法在完成任务后关闭DataReader。相反,BLL会请求DAL提供一个DataSet/DataTable,由DAL来满足这个请求。它通过执行Fill操作(参考TomTom的观点,查看堆栈跟踪,你会看到其中有一个DataReader)来实现这一点。然后BLL对结果集进行喜欢的操作。


-1:这并没有回答问题。OP没有要求提供DataReader和DataAdapter的替代方案。 - John Saunders
2
我不同意:他问“在什么情况下使用DataAdapter + DataTable组合比使用DataReader更好”,我回答(或至少对讨论做出了贡献),给出了我设计事物的方式的描述。如果我所描述的设计听起来像他的应用程序,那么我建议使用DataAdapter而不是DataReader就是有效的。顺便说一句,我并不是在贬低DataReader。除非我从表示层调用数据库(我不这样做),否则我个人从未有过使用它的理由。请重新考虑你的反对票。 - Brad

1
使用DataReader和DataAdapter时需要考虑哪些问题?
DataReader是很好的底层接口,基本上是唯一的接口 - 如果你将数据加载到更高级的结构中,实际加载总是使用DataReader来完成。
DataAdapter / DataSet:这些东西不被喜欢结构化编程、喜欢优美代码并且不只是偶然编写报告应用程序的人所使用。使用ORM代替 - NHibernate(好),Linq2SQL(差),Entity Framework(差)或其他更好的抽象化工具。

0

我猜这个问题只是在讨论proc和cons,并且离题了

*Data Reader在获取数据方面比DataAdapter快得多,但您必须知道什么是Disconnected mode

*DataReader或Connected mode和DataAdapter Disconnected mode在相同的场景中使用,但有时候在离线模式下更好,因为您可以脱离数据

*但是,断开模式提供了丰富的API,如DataAdapter、DataView、DataTable和DataSet。强大的功能是,您只需为您的DataAdapter提供SELECT、INSERT、UPDATE、DELETE命令,将单个表或多个表的数据附加到您的DataAdapter中,一行代码Adapter.Fill(DataTable)或Adapter.Fill(DataSet),更新数据的方式与之相同Adapter.Update(DataTable)

*在离线模式下更新分层数据比在连接模式下工作要好得多,后者需要使用额外的代码和额外的逻辑来维护,在离线模式下,您可以更新仅插入的行或已更新的行或已删除的行,而更新操作包含在Dot Net Transaction中Adapter.Update(DataTable.Select("","",DataViewRowState.Added))

*在离线模式下,您可以获得数据中每个单独行的版本,此外,您可以将更改应用于您的数据DataTable.GetChanges()

断开模式为您提供了 stronglyTypedDataSet,因此您可以获得数据定义架构和关系,您可以获取父行和子行。

断开模式提供了按主键获取行的方法,还可以使用特定条件获取行 DataTable.Select("FilterExpression","SortOrder",DataRowViewState)。

您可以在 DataTable 上进行计算,而不会干扰服务器的计算,例如选择 productID、ProductName、Price、Quantity、price*quantity 作为 Total,您可以轻松添加具有特定条件(price*quantity)的列。

您可以对抓取的 DataTable 进行聚合,DataTable.Compute("Sum(price)","price>250")。

在断开模式下,您拥有 CommandBuilder,它为您创建 SQL 命令,但它仅适用于单个表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接