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

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

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

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

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

您无法使用datareader进行更新。

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

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

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

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

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

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

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

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

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

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

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

从不使用DataReader。

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

使用DataReader和DataAdapter时我需要考虑的事项

DataReader:良好的低级接口。 PRLYty很多ONLY接口 – 如果您将数据加载到更高的结构中,实际负载总是使用DataReader完成。

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

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

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

* DataReader或Connected模式以及DataAdapter断开连接模式正在相同的场景中使用,但有时候断开连接模式会更好,以防您成为数据的一种方式

*但Disconnectiod模式提供了丰富的API,如DataAdapter,DataView,DataTable和DataSet。 function强大的是你只需为你的DataAdapter提供SELECT,INSERT,UPDATE,DELETE命令,从单个表或多个表中附加数据,使用一行代码Adapter.Fill(DataTable)或Adapter.Fill(DataSet),以及与更新数据适配器相同的方式.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,但它只用于单个表