【问题标题】:ADO.NET Question: When to use DataReader, DataAdapterADO.NET问题:何时使用DataReader、DataAdapter
【发布时间】:2010-09-12 04:48:23
【问题描述】:

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

【问题讨论】:

    标签: c# ado.net sqldatareader


    【解决方案1】:

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

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

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

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

    DataAdapter :您可以使用数据适配器读取/更新数据,但读取数据时速度不如 Datareader。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 如果将数百万条记录(例如:我的数据表中的 2-3 百万条记录)转储到数据库中,数据适配器是否是一个不错的选择???
        【解决方案4】:

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

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

        没有数据集和数据表,您就无法使用 DataAdapter。

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

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

        【讨论】:

        • 如果将数百万条记录(例如:我的数据表中的 2-3 百万条记录)转储到数据库中,数据 dapater 是否是一个不错的选择???
        • 试试吧,牵扯的因素太多了。另外,不要在 cmets 中提问,这不是论坛。查找现有的,否则使用“询问”按钮。
        • 你能帮我解决这个问题吗:stackoverflow.com/questions/37970073/…
        【解决方案5】:

        从不使用 DataReader。

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

        【讨论】:

        • -1:这不能回答问题。 OP 没有要求 DataReader 和 DataAdapter 的替代品。
        • 我不同意:他问“在什么情况下使用 DataAdapter + Datatable 组合比使用 DataReader 更好”,我通过描述我的方式来回答(或至少有助于讨论)有设计的东西。如果我描述的设计听起来像他的应用程序,那么我建议在 DataReader 上使用 DataAdapter 是有效的。顺便说一句,我不是在对 DataReader 大便。我个人从来没有理由使用它,除非我从表示层调用数据库,我不这样做。请重新考虑您的反对票。
        【解决方案6】:

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

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

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

        【讨论】:

          【解决方案7】:

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

          *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) 附加来自单个表或多个表的数据,以及与更新数据适配器相同。更新(数据表)

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

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

          *断开模式为你提供strongTypedDataSet,让你得到你的数据定义模式和关系,你可以得到父子行

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

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-02-12
            • 2011-08-09
            • 2011-10-26
            • 2014-11-12
            • 1970-01-01
            • 1970-01-01
            • 2011-03-18
            • 1970-01-01
            相关资源
            最近更新 更多