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

时间:2010-09-12 04:48:23

标签: c# ado.net sqldatareader

我只是想知道,在使用DataReader和DataAdapter从数据库中获取数据时我需要考虑哪些事情,而另外两个之间的区别是datareader需要打开连接而datadapter不需要...在我们的项目中,在我们所有的DAL中使用DataReader,我们从不使用dataadapter。所以我想知道使用DataAdapter + Datatable组合比使用DataReader更好的情况。提前谢谢。

7 个答案:

答案 0 :(得分:7)

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

假设您正在拥有一个客户类,并且您希望拥有完全初始化的对象,并填写所有客户属性(如名称,地址等)。

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

您无法使用datareader进行更新。

DataAdapter:您可以使用dataadapters读取/更新数据,但在读取数据然后使用Datareader时速度会更快。

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

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

DataAdapter是另一回事,它能让你在内存中拥有数据记录。这允许您使GUI浏览数据,编辑数据等。它更通用但不适用于大型数据集。

答案 3 :(得分:3)

您只想在使用DataSet时使用DataAdapter 适配器具有两个主要方法Fill()Updater()来读取数据集并将其写入数据库。

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

如果没有数据集和DataTable,则无法使用DataAdapter。

所以真正的问题是:您想在DAL中使用哪种存储类? DataSet既可行又简单,但它是一种老化的技术(不再改进)。

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

答案 4 :(得分:2)

从不使用DataReader。

由于我强烈地对应用程序进行分层,因此我的DAL负责与数据库通信,而我的BLL负责构建对象,BLL在完成后无法关闭DataReader。而是BLL从DAL请求DataSet / DataTable,DAL满足。它通过执行填充来执行此操作(对TomTom的点>查看堆栈跟踪,是的,您将在其中看到DataReader)。然后BLL用结果集做它喜欢的东西。

答案 5 :(得分:1)

  

我必须考虑什么事情   使用DataReader和DataAdapter

DataReader:良好的低级接口。非常简单的ONLY接口 - 如果您将数据加载到更高的结构中,实际的负载总是使用DataReader完成。

DataAdapter / DataSet:喜欢结构化程序和漂亮代码的人不会使用的东西,而不只是编写报告应用程序。使用ORM代替 - NHipernate(好),Linq2SQL(坏),实体框架(坏)或其他更好的抽象。

答案 6 :(得分:0)

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

*数据读取器在获取数据时比DataAdapter快得多,但您必须知道什么是完全断开模式

* DataReader或连接模式和DataAdapter断开连接模式正在相同的场景中使用,但有些时候断开连接模式会更好,以防你的数据方式

*但Disconnectiod模式提供了丰富的API,如DataAdapter,DataView,DataTable和DataSet。功能强大的是你只需为你的DataAdapter提供SELECT,INSERT,UPDATE,DELETE命令,从单个表或多个表中附加数据,使用一行代码Adapter.Fill(DataTable)或Adapter.Fill(DataSet),以及与更新Data 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,您可以轻松添加具有特定条件的列(价格*数量)

*您可以进行聚合或抓取DataTable,DataTable.Compute(“Sum(price)”,“price> 250”)

*在Disconnected模式下你有CommandBuilder,它为你创建sqlcommands,但它只用于单个表