8

我只是想知道,在使用 DataReader 和 DataAdapter 从数据库中获取数据时我必须考虑哪些事情,以及这两个数据读取器需要打开连接而数据适配器没有...在我们的项目中,使用 DataReader我们所有的 DAL,我们从不使用数据适配器。所以我想知道在什么情况下使用 DataAdapter + Datatable 组合比使用 DataReader 更好。提前致谢。

4

7 回答 7

7

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

假设,您有一个客户类,并且您希望拥有完全初始化的对象,其中填充了所有客户属性,例如(名称、地址等)

您将在此处使用 DataReader 并仅填充实体并关闭阅读器。

您不能使用数据读取器进行更新。

DataAdapter:您可以使用 dataadapter 读取/更新数据,但读取数据时速度较 Datareader 慢。

您可以使用 DataAdapter 更新数据,但使用阅读器则不会

于 2010-09-12T05:06:47.550 回答
3

在做 ADO.NET 的事情时,我几乎总是喜欢 DataReader。原因是,它不会强迫您将数据存储在客户端上的时间超过您必须的时间。

这也是何时将 DataAdapter 用于 DataSet/Table 的答案;当您想将数据存储在客户端上时,也许以某种方式使用它 - 来回迭代它,或将其作为一个集合进行操作,而不是简单地将值输出到网格中,其中 Reader,IMO,是更好的选择。

于 2010-09-12T04:53:06.247 回答
3

DataReader允许您处理每条记录并将其丢弃,这在您要处理大量彼此无关的数据记录时非常有用。例如,DataReader当您想从数据库中的每条记录中计算一些复杂的统计值时,或者要将大量数据记录保存到本地文件中时,您可能会使用它。

DataAdapter是别的东西,它能够让你在内存中有数据记录。这允许您制作 GUI 来浏览数据、编辑数据等。它更通用,但不适用于大型数据集。

于 2010-09-12T06:12:26.233 回答
3

您只想在使用 DataSet 时使用 DataAdapter。
适配器有 2 种主要方法Fill()Updater()可以从数据库中读取数据集并将其写入数据库。

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

如果没有 Datasets 和 DataTables,您就无法使用 DataAdapter。

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

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

于 2010-09-12T07:36:35.683 回答
2

从不使用 DataReader。

由于我对应用程序进行了强烈分层,因此我的 DAL 负责与数据库通信,而我的 BLL 负责构建对象,因此 BLL 无法在完成后关闭 DataReader。相反,BLL 向 DAL 请求一个 DataSet/DataTable,DAL 完成了该请求。它通过执行填充来做到这一点(TomTom 的观点> 查看堆栈跟踪,是的,您将在那里看到一个 DataReader)。BLL 然后对结果集做它喜欢的事情。

于 2010-09-16T15:58:55.680 回答
1

使用 DataReader 和 DataAdapter 时我必须考虑的事项

DataReader:良好的低级接口。几乎是唯一的接口 - 如果您将数据加载到更高的结构中,实际加载总是使用 DataReader 完成。

DataAdapter / DataSet:那些喜欢结构化程序和漂亮代码并且不只是碰巧编写报告应用程序的人不使用的东西。改用 ORM - NHipernate(好)、Linq2SQL(坏)、实体框架(坏)或其他更好的抽象之一。

于 2010-09-12T05:14:07.837 回答
0

我想这个问题只是为了谈论过程和缺点,并且偏离代码

*Data Reader 在获取数据方面比 DataAdapter 快得多,但您必须知道究竟什么是断开连接模式

*DataReader 或 Connected 模式和 DataAdapter Disconnected 模式在相同的场景中使用,但有时如果您是数据的一种方式,Disconnected 模式会更好

*但Disconnectiod模式提供了丰富的API,如DataAdapter、DataView、DataTable和DataSet。强大的是您只需为 DataAdapter 提供 SELECT、INSERT、UPDATE、DELETE 命令,使用一行代码 Adapter.Fill(DataTable) 或 Adapter.Fill(DataSet) 附加来自单个表或多个表的数据,以及与更新数据 Adapter.Update(DataTable) 的方式相同

*在断开连接模式下更新分层数据比在连接模式下工作要好得多,连接模式必须使用额外的代码和额外的逻辑来维护,在断开连接模式下,除了更新操作之外,您可以仅更新插入的行或更新的行或删除的行包裹在 Dot Net Transaction Adapter.Update(DataTable.Select("","",DataViewRowState.Added))

*在断开连接模式下,您可以获取数据中每一行的版本,此外您还可以更改数据 DataTable.GetChanges()

*断开模式为您提供strongTypedDataSet,因此您可以获取数据定义模式和关系,您可以获取父行和子行

*断开连接模式提供了通过 PrimaryKey 获取行的方法,也可以获取具有特定条件的行 DataTable.Select("FilterExpression","SortOrder",DataRowViewState)

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

*您可以进行聚合或您抢夺的 DataTable ,DataTable.Compute("Sum(price)","price>250")

*在断开连接模式下,您有 CommandBuilder 它为您创建 sqlcommands,但它仅适用于单个表

于 2014-05-01T12:57:52.860 回答