首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SqlDataAdapter vs SqlDataReader

SqlDataAdapter vs SqlDataReader
EN

Stack Overflow用户
提问于 2009-11-05 05:30:06
回答 5查看 128.7K关注 0票数 139

使用SqlDataAdapter和SqlDataReader从数据库获取数据有什么不同?

我特别研究了它们的优点和缺点以及它们的速度和内存性能。

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-11-05 05:37:53

DataReader:

  • 需要将连接保持打开直到完成(不要忘记将其关闭!)。
  • 通常只能在
  • 不再用于更新回数据库

时进行迭代

另一方面,它:

在内存中,

  • 一次只有一条记录,而不是整个结果集(这可以是你能得到的最快的结果集),你可以更快地开始处理结果(一旦第一条记录可用)。对于某些查询类型,这也可能是一个非常大的问题。

DataAdapter/DataSet

  • 允许您在完成数据加载后立即关闭连接,甚至可以为您关闭内存中提供的结果
  • 您可以根据需要对其进行多次迭代,甚至可以按索引查找特定记录
  • 具有一些用于更新回数据库的内置功能

以下列为代价:

  • memory memory use
  • 您要等到加载完所有数据后才能使用其中的任何数据

所以这真的取决于你在做什么,但我倾向于更喜欢DataReader,直到我需要只有dataset支持的东西。SqlDataReader非常适合绑定到只读网格的常见数据访问情况。

有关更多信息,请参阅the official Microsoft documentation

票数 203
EN

Stack Overflow用户

发布于 2009-11-05 05:37:10

这个问题的答案可能是相当广泛的。

从本质上讲,对我来说,主要的区别通常会影响我决定使用哪种方式,那就是使用SQLDataReader时,您将从数据库中“流式传输”数据。使用SQLDataAdapter,您可以将数据库中的数据提取到一个对象中,该对象本身可以进一步查询,还可以在上执行CRUD操作。

显然,对于数据流,SQLDataReader要快得多,但一次只能处理一条记录。有了SQLDataAdapter,您就可以从数据库中获得与查询匹配的行的完整集合,以便使用/传递您的代码。

警告:如果您使用的是SQLDataReader,请始终、始终、始终确保编写正确的代码来关闭连接,因为您将使用SQLDataReader保持连接打开。如果不这样做,或者在处理结果时出现错误的情况下进行适当的错误处理以关闭连接,将会通过连接泄漏您的应用程序。

请原谅我的VB,但这是使用SqlDataReader时您应该拥有的最低代码量:

代码语言:javascript
复制
Using cn As New SqlConnection("..."), _
      cmd As New SqlCommand("...", cn)

    cn.Open()
    Using rdr As SqlDataReader = cmd.ExecuteReader()
        While rdr.Read()
            ''# ...
        End While
    End Using
End Using     

等效C#:

代码语言:javascript
复制
using (var cn = new SqlConnection("..."))
using (var cmd = new SqlCommand("..."))
{
    cn.Open();
    using(var rdr = cmd.ExecuteReader())
    {
        while(rdr.Read())
        {
            //...
        }
    }
}
票数 18
EN

Stack Overflow用户

发布于 2009-11-05 05:36:23

SqlDataAdapter通常用于填充DataSet或DataTable,因此您可以在关闭连接后访问数据(断开连接访问)。

SqlDataReader是一个只快速前进的连接游标,它通常比填充DataSet/DataTable更快。

此外,使用SqlDataReader,您可以一次处理一条记录的数据,并且不在内存中保留任何数据。显然,对于DataTable或DataSet,您确实有内存分配开销。

如果你不需要将你的数据保存在内存中,那么只为了渲染东西,使用SqlDataReader。如果您想以断开连接的方式处理数据,请选择填充DataSet或DataTable的DataAdapter。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1676753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档