Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SqlDataAdapter vs SqlDataReader

SqlDataAdapter vs SqlDataReader
EN

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

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

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

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-11-04 21:37:53

DataReader:

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

时进行迭代

另一方面,它:

在内存中,

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

DataAdapter/DataSet

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

以下列为代价:

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

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

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

票数 203
EN

Stack Overflow用户

发布于 2009-11-04 21:37:10

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

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

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

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

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

代码语言:javascript
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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-04 21: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

复制
相关文章
ADO数据库C#中ExecuteReader、ExecuteNonQuery、ExecuteScalar、SqlDataReader、SqlDataAdapter
CommandType 命令类型,如果是sql语句,则为CommandType.Text,否则为 CommandType.StoredProcdure
全栈程序员站长
2022/08/28
9000
浅谈ADO.NET中的对象——Connection、Command、DataReader、DataAdapter、DataSet、DataTable
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/39450171
DannyHoo
2018/09/13
1.2K0
浅谈ADO.NET中的对象——Connection、Command、DataReader、DataAdapter、DataSet、DataTable
C#数据库操作的3种典型用法
由于最近和数据库打交道,需要用C#和SQL Server 2005进行操作,就把近段时间内的最常用的操作做个总结.本人也是第一次用C#操作数据库,所以这三种典型用法对初学者还是挺有帮助的.
阳光岛主
2019/02/19
6760
数据库之ADO.NET基础知识整理
       之前我们所学只能在查询分析器里查看数据,操作数据,我们不能让普通用户去学sql,所以我们搭建一个界面(Web Winform)让用户方便的操作数据库中的数据
洋仔聊编程
2019/01/15
2K0
在.NET中调用存储过程
因为做项目要用到数据库,因此存储过程是必不可少的,看了一点如何在.NET中调用存储过程的资料,颇有点心得,觉得这个东西是当用到数据库的时候必须要会的一项技术。下面是它的定义:
SAP梦心
2022/05/07
2.4K0
自定义 SqlHelp
1 using System; 2 using System.Collections.Generic; 3 using System.Data.SqlClient; 4 using System.Data; 5 using System.Configuration; 6 using System.Reflection; 7 using System.Collections; 8 namespace DataHelp 9 { 10 #region ADO.NET
跟着阿笨一起玩NET
2018/09/19
5080
ExecuteReader在执行有输出参数的存储过程时拿不到输出参数
异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 后期会在博客首发更新:http://dnt.dkill.net/Article/D
逸鹏
2018/04/10
1.4K0
ExecuteReader在执行有输出参数的存储过程时拿不到输出参数
基于Flowportal.Net写自己的应用时使用SqlDataReader遇到的一个问题
在使用Flowportal.Net BPM的时候,因为一个特殊的步骤需要自动根据ERP中的订单状态自动审批,在设计流程的时候,把这个步骤设定为2个处理人的共享任务。其中一个是专门设定的一个系统账号。然后,我创建了一个Winform的程序,自动执行以下的代码:先从BPM数据库中读取出来未处理的当前流程、当前步骤的清单,接着循环判断而去使用单独创建的用户登录到BPM取得共享任务并审批通过,当然了如果判断ERP系统未处理的话,就把只把当前任务取下来作为系统账号的个人任务。 程序的逻辑很清楚了,但是忽略了一个问题,在从BPM数据库读取数据的时候,偷懒是用了SqlDataReader,造成在循环内的BPM更新一直超时。后改为Dataset之后,问题解决。原因是SqlDataReader是读取完毕所有的查询结果后才断开数据库连接,所以在循环内部就会出现已经存在一个数据库连接,造成新建连接冲突。改为Dataset之后,就可以把结果放入Dataset(服务器的内存里),然后关闭对数据库的连接了,这时候那个逐行的循环更新就不会有问题了。
崔文远TroyCui
2019/02/27
6350
关于数据库存储过程分页DatagridView BindingNavigator 控件的详细实现
BindingNavigator: 就是DataGridView控件上面的那个,在工程里名字: bindngrDemo
全栈程序员站长
2022/09/14
4900
关于数据库存储过程分页DatagridView BindingNavigator 控件的详细实现
C#数据库操作类
using System; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; u
zls365
2020/08/19
1.7K0
C#操作Sql Server数据库以及MD5加密存储
简单地写一下MD5加密存储和C#如何操作Sql Server数据库吧。(注意哦:真的是特别简单地写了一下几个对象的实例化)。
喜欢ctrl的cxk
2019/11/07
2K0
.NET基础拾遗(6)ADO.NET与数据库开发基础
  SQL语句时操作关系型数据库的基础,在开发数据访问层、调试系统等工作中十分常用,掌握SQL对于每一个程序员(无论是.NET、Java还是C++等)都非常重要。这里挑选了一个常见的面试题目,来热热身。
Edison Zhou
2018/08/20
9690
.NET基础拾遗(6)ADO.NET与数据库开发基础
C#多曲线数据分析
明志德道
2023/10/21
2930
C#多曲线数据分析
重新审视SqlDataReader的使用
      ADO.NET 1.x 利用SqlDataReader读取数据,针对每个结果集需要一个独立的连接。当然,你还必须管理这些连接并且要付出相应的内存和潜在的应用程序中的高度拥挤的瓶颈代价-特别是在数据集中的Web应用程序中。       ADO.NET 2.的一个新特征多数据结果集(Multiple Active Result Sets,简称MARS)-它允许在单个连接上执行多重的数据库查询或存储过程。这样的结果是,你能够在单个连接上得到和管理多个、仅向前引用的、只读的结果集。目前实现这个功能的数据
张善友
2018/01/19
7630
我的数据访问函数库的源代码(二)—— SQL语句部分
/* 2008 4 25 更新 */ 我的数据访问函数库的源码。整个类有1400行,原先就是分开来写的,现在更新后还是分开来发一下吧。 第二部分:SQL语句部分。 传入SQL语句,执行相关的操作。 //查询语句部分         #region 运行查询语句返回记录(DataSet、DataTable、DataRow、String[]、String)              /// <summary>         /// 运行SQL查询语句 返回DataSet。可以传入多条查询语句,返回
用户1174620
2018/02/07
1.4K0
网页上的账号、密码登陆验证,是如何实现的?(二)比对数据库中的账号密码
需求 通过在页面输入账号密码,实现从数据库查询数据并返回,验证成功后登录,打开主界面。 using System; using System.Collections.Generic; using Sy
跋扈洋
2021/04/25
2.3K0
网页上的账号、密码登陆验证,是如何实现的?(二)比对数据库中的账号密码
c#操作数据库(winform如何修改数据库设置)
大家好,又见面了,我是你们的朋友全栈君。鉴于很多童鞋们对数据库操作不是很熟悉,这里对数据库操作的相关知识做个介绍。
全栈程序员站长
2022/07/29
2.2K0
c#操作数据库(winform如何修改数据库设置)
asp.net 建多个项目实现三层的实例——读取一张表中的记录条数
  学习asp.net两周,通过学习发现,.net和php之间的区别还是蛮大的,比php要复杂一些,开始学习的有些吃力,后来跟着传智播客里的老师学习,渐渐的学到了一些东西。
CherishTheYouth
2019/09/12
1.3K0
asp.net 建多个项目实现三层的实例——读取一张表中的记录条数
用ASP.NET做一个简单的数据流动展示
需求:连接数据库,在网页上显示一行数据,总共十列,每两秒刷新一次,刷新时数据往前流动(后一个单元格覆盖前一个单元格,最后一个单元格生成一个随机数)
凌川江雪
2019/02/25
6220
用ASP.NET做一个简单的数据流动展示
WinForm之窗体应用程序
WinForm之窗体应用程序 基本简单数据库操作(增删改查) 1 using System; 2 using System.Collections.Generic; 3 using System.Windows.Forms; 4 5 namespace DataBaseOperation 6 { 7 static class Program 8 { 9 /// <summary> 10 /// 应用程序的主入口点。 11 /
用户1112962
2018/07/04
1.4K0

相似问题

SqlDataAdapter和SqlDataReader

20

如何同时运行SqlDataReader和SqlDataAdapter?

20

Compact vs SqlDataAdapter

10

SP返回输出,但SqlDataReader/SqlDataAdapter未返回

10

使用SqlDataAdapter对SqlDataReader源代码进行分页

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档