如果 SqlDataAdapter 内部使用数据读取器,为啥人们说使用 SqlDataReader 更快?

Posted

技术标签:

【中文标题】如果 SqlDataAdapter 内部使用数据读取器,为啥人们说使用 SqlDataReader 更快?【英文标题】:If SqlDataAdapter uses a data reader internally, why do people say that using a SqlDataReader is faster?如果 SqlDataAdapter 内部使用数据读取器,为什么人们说使用 SqlDataReader 更快? 【发布时间】:2012-10-30 15:16:28 【问题描述】:

我一直在读到 SqlDataReaders 比 SqlDataAdapters 快得多,因为它们具有快进、只读、一次一行连接的特性,并且在填充 DataTable 对象时它们比 SqlDataAdapters 快得多(SqlDataAdapter.Fill(dataTable))。

然而,这里和那里有人会提到“你使用什么可能不会有什么不同,因为 SqlDataAdapter 在内部使用数据读取器来填充它的表。”如果这是真的,那么如果适配器通过使用内部数据读取器与数据库进行通信,它到底怎么会慢这么多呢?

我知道我可以设置一些测试并分析每个测试的性能,但我真正希望有人能够阐明所谓的性能差异,如果我们基本上以任何一种方式处理相同的过程.

我知道您通常会使用阅读器来创建强类型 POCO 的列表,这与仅填充表格的数据适配器不同。但是,我的问题严格来说是关于两者之间性能差异的细节,而不是 O/RM 问题......

【问题讨论】:

【参考方案1】:

如果您使用的是 DataReader,您可以在读取第一行时对某些信息做出反应,甚至可以忽略其余的读数。

如果您使用的是 DataAdapter,则必须先加载整个表并然后读取第一行才能对相同的信息做出反应。

【讨论】:

已适当注明,但如果我不必检查每一行的某些情况怎么办?换句话说,如果我只想检索整个记录子集以填充 GridView 怎么办? @bglee 您必须找到您的来源,以了解为什么您认为 DataReader 在所有情况下都比 DataAdapter 快。它们只是访问数据的不同工具。 DataAdapter 是较重的对象,因为它们可以对数据执行更多操作,例如更新、删除等。

以上是关于如果 SqlDataAdapter 内部使用数据读取器,为啥人们说使用 SqlDataReader 更快?的主要内容,如果未能解决你的问题,请参考以下文章

使用 sqldataadapter.fill 刷新数据 - 看不到新数据

如何在 SQLDataAdapter 中使用更新语句

SqlDataAdapter 不会从表中删除行

C# SqlDataAdapter 不填充数据集

C#中SqlDataAdapter的使用小结

使用 SqlDataAdapter 插入一行