【问题标题】:What's better: DataSet or DataReader?哪个更好:DataSet 还是 DataReader?
【发布时间】:2010-11-08 03:58:12
【问题描述】:

刚看到这个话题:Datatable vs Dataset 但这并没有解决我的疑问..让我更好地解释一下,我正在与数据库进行连接,需要在 GridView 中显示结果。 (我之前在使用 VB6 时使用了 RecordSet,DataSet 与它非常相似,因此使用 DataSet 更容易。) 然后一个人告诉我 DataSet 不是最好的方法..

那么,我应该“学习” DataReader 还是继续使用 DataSet ?数据表? 有什么优点/缺点?

【问题讨论】:

    标签: c# asp.net ado.net


    【解决方案1】:

    DataReader 用于从数据库中检索只读和只进数据。它一次只能读取一行并且只能向前读取,不能向后/随机读取。 DataReader 无法将数据更新/操作回数据库。它从单个表中检索数据。由于它是连接架构,只要连接存在,数据就可用。 DataSet 是内存中的表。它是断开连接的架构,自动打开连接并将数据检索到内存中,完成后关闭连接。它一次将所有数据从数据源提取到其内存中。 DataSet 有助于从多个表中获取数据,它可以来回/随机/随机获取。DataSet 可以更新/插入/操作数据。

    【讨论】:

      【解决方案2】:

      数据读取器与数据集

      1) - DataReader 是在面​​向连接的架构中设计的
      - DataSet 是在断开的架构中设计的

      2) - DataReader 提供对数据的只进访问
      - DataSet 为数据提供可滚动导航

      3) - DataReader 是只读的,我们无法更改它下面的数据
      - DataSet 是可更新的,我们可以对其下存在的数据进行更改并将这些更改发送回数据源

      4) - DataReader 不提供数据搜索和排序等选项
      - DataSet 提供数据的搜索和排序等选项

      【讨论】:

        【解决方案3】:

        本质上是:“哪个更好:桶还是软管?”

        DataSet 是这里的桶;它允许您携带一组断开连接的数据并使用它 - 但您将承担携带存储桶的成本(因此最好将其保持在您喜欢的大小)。

        数据读取器是软管:它提供单向/一次性访问数据,因为它飞过您;您不必一次携带所有可用的水,但需要将其连接到水龙头/数据库。

        就像你可以用软管填充桶一样,你可以用数据读取器填充DataSet

        我想说的是,他们做不同的事情......

        我个人不经常使用DataSet - 但有些人喜欢它们。但是,我确实使用数据读取器进行 BLOB 访问等。

        【讨论】:

        • @Marc,很好的比喻。当您不使用 BLOB 时,您使用哪种数据访问方式?
        • @Ash - 通常是 LINQ-to-SQL、SqlBulkCopyIDataReader非常很少,DataTable。实际上大约两次(曾经)。
        • 最近还有“dapper” :)
        【解决方案4】:

        进一步Marc's 点:您可以使用完全没有数据库的DataSet。

        您可以从 XML 文件或仅从程序中填充它。用一个数据库中的行填充它,然后转身将其写入另一个数据库。

        DataSet 是关系模式的完全内存表示。是否将它与实际的关系数据库一起使用取决于您。

        【讨论】:

        • 仅作记录,数据读取器也是如此 - 请参阅“CsvReader”、“DataTableReader”等。为了将其推回数据库,SqlBulkCopy(作为示例)将与DataTable 或 IDataReader。
        【解决方案5】:

        要回答您的第二个问题 - 是的,您应该了解 DataReaders。如果有的话,那么您了解如何使用它们。

        我认为在这种情况下你最好使用 DataSets - 因为你正在做数据绑定和所有工作(我在想 CPU 周期与人力)。

        至于哪一个会提供更好的性能。这在很大程度上取决于您的情况。例如,如果您正在编辑要绑定的数据并批量处理更改,那么使用 DataSet 会更好

        【讨论】:

          【解决方案6】:

          这取决于您的需求。最重要的区别之一是 DataReader 将保留与数据库的打开连接,直到您完成它,而 DataSet 将是内存中的对象。如果将控件绑定到 DataReader,那么它仍然是打开的。此外,DataReader 是一种只能向前读取无法操作的数据的方法。使用 DataSet,您可以在您认为合适的时候来回移动和操作数据。

          一些附加特性:DataSet 可以序列化并以 XML 表示,因此可以轻松地传递到其他层。 DataReader 不能被序列化。

          另一方面,如果您要从数据库中读取大量行,然后将这些行交给某个业务规则的某个进程,则 DataReader 可能更有意义,而不是加载包含所有行的 DataSet,占用内存并可能影响可扩展性。

          这是一个有点过时但仍然有用的链接:Contrasting the ADO.NET DataReader and DataSet

          【讨论】:

          • 链接已损坏。请修复或删除它。
          【解决方案7】:

          不同的需求,不同的解决方案。

          正如您所说,数据集与 VB6 Recordset 最相似。也就是说,拉下你需要的数据,传递它,随心所欲地使用它。哦,然后在你完成后最终摆脱它。

          Datareader 受到更多限制,但当您只需要读取一次数据时,它会提供更好的性能。例如,如果您自己填充网格 - 即提取数据,遍历它,为每一行填充网格,然后丢弃数据 - datareader 比 dataset 要好得多。另一方面,如果您有任何更新数据的意图,甚至不要尝试使用 datareader...

          所以,是的,学习它 - 但只在适当的时候使用它。数据集为您提供了更大的灵活性。

          【讨论】:

          • 感谢 AviD 和 Ahmad Mageed 的快速回复。这会让我思考(n'学习)很多! :)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-30
          相关资源
          最近更新 更多