文档章节

DataReader和DataSet区别

Geometry
 Geometry
发布于 2015/08/25 10:12
字数 1120
阅读 11
收藏 0

第一种解释

DataReaderDataSet最大的区别在于,DataReader使用时始终占用SqlConnection(俗称:非断开式连接),在线操作数据库时,任何对SqlConnection的操作都会引发DataReader的异常因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的。由于DataReader的特殊性和高性能,所以DataReader是只进的,你读了第一条后就不能再去读取第一条了。
DataSet
则是将数据一次性加载在内存中,抛弃数据库连接(俗称:断开式连接)。读取完毕即放弃数据库连接,因为DataSet将数据全部加载在内存中,所以比较消耗内存。但是确比DataReader要灵活,可以动态的添加行,,数据,对数据库进行回传,更新操作等。

 

第二种解释

使用DataReader与DataSet都可以从数据源读取数据。DataReader本身是通过IDbCommand.ExecuteReader()方法进行构建的;而DataSet则是通过DbDataAdapter.Fill()方法进行填充。此外,两者的工作方式有明显的不同:DataReader的执行过程不能脱离数据库连接,也就是在DataReader读取数据的时候不能够使用IDbConnection.Close()方法关闭数据库连接;而在使用DataSet获取数据时,可以断开数据库的连接,因为此时DbDataAdapter已经负责将数据获取到应用服务器中了。
由于有这样的区别,所以在开发数据库相关程序时需要特别注意。例如在使用DataReader获取数据后,应该主动地关闭数据库连接,否则可能出现数据库连接池溢出的异常。

 

第三种解释

可以使用DataReader类的对象或DataSet类的对象从数据库读取数据,但它们是有区别的,归纳起来大致有以下几条:

1.       DataReader是数据管理提供者类,而DataSet是一般性数据类。

2.       DataSet获取数据需要通过桥梁DataAdapter的填充,由于DataReader本身就是管理提供者,它可以通过Command的ExecuteReader()方法就可以获取数据。

3.       DataReader是在线处理,当连接关闭后就不能读取数据;DataSet可以离线处理数据,它是把数据从数据库拷贝到本地存储,在关闭连接的情况下仍然可以在DataSet中处理数据,甚至可以在本地存储的表格中增加限制。

4.       DataReader只能正向读取数据,但不能修改数据;DataSet可以按任何顺序读行,可以按灵活的方式搜索、排序和过滤这些行,甚至可以改变这些行,然后将这些改变同步到数据库中。

5.       从DataReader读取数据的速度快于DataSet。

6.       由于DataSet是离线处理,所以当在事务处理中要锁定数据库时,不可以使用DataSet。因为当DataSet被填充以后,会自动断开与数据库的连接,此时不可能再对数据库进行锁定。

 

可以看出,在通常情况下,DataSet与 DataReader可能可以相互代替,当有特定要求时却需要仔细分析,到底使用哪种方式更合适。

DataReader与DataSet最根本的区别就在于一个是在线处理,另一个是离线处理。在线时,得到的是数据库当前的真实数据,但总是在线的话,增加了网络的通讯负担。离线后数据拷贝在本地,可以减轻网络负担,程序处理数据更加方便,若离线时间过长,看到的数据就不一定是真实的数据了。

补充经验:大数据量上使用DataSet和DataReader混用,当单表数据量很大时,使用DataSet是一种很不明智的选择,因为DataSet是以DataTable内存形式存放数据,一次性将很大数据放入内存,这是非常吃内存的。相比DataSet,DataReader就显得优雅很多,它是每次只读取一条数据,然后循环调用机制。但它也有弊端,就是相对非断开连接,但是对内存消耗而言这是有利的。DataSet在大部分应用场景下也是有自己优点的,比如充分解耦、一次操作、领域模型操作等。

所以要根据不同场景合理使用这两种对象。 

© 著作权归作者所有

共有 人打赏支持
Geometry
粉丝 0
博文 3
码字总数 4203
作品 0
朝阳
程序员
私信 提问
DataReader与DataSet有什么区别?

dataset表示一个数据集,是数据在内存中的缓存。 可以包括多个表 DatSet 连接数据库时是非面向连接的。把表全部读到Sql中的缓冲池,并断开于数据库的连接 datareader 连接数据库时是面向连接...

hopegaosh
2011/04/02
0
0
用DataReader还是DataSet?

作者:Jonathan Goodyear 出处:网络 我经常听到有人问这个问题:“在ASP.NET Web应用程序中我应该用DataReader类还是DataSet类呢?”在很多文章以及新闻组的贴子中我经常看到这样的误解,即...

晨曦之光
2012/03/09
97
0
数据库的应用

作者:飞刀 我们必须得了解一下DataReader,DataSet和DataGrid控件,DataGrid是显示控件,大家自已去看它相关的应用,我们在这里不哆嗦,DataReader和DataSet都可以用来储存数据内容,不过Dat...

晨曦之光
2012/03/09
48
0
浅谈ADO.NET中的五个主要对象

ADO.NET 对象模型中有五个主要的组件,分别是Connection 对象、Command 对象、DataSetCommand、DataSet 以及DataReader。这些组件中 负责建立联机和数据操作的部分 我们称为数据操作组件(M...

zting科技
2017/01/12
0
0
IBatis.net使用说明

IBatis.net是移植于java版本,所以在.net平台上的操作和java平台上的操作基本没有什么太大的差别。严格来说,ibatis.net并不算的上是一种orm,因为它的sql语句均写到了配置文件中,没有自己专...

JungleKing
2016/11/23
12
0

没有更多内容

加载失败,请刷新页面

加载更多

即学即用,轻松搞定这些选择器!(上)

所谓基本选择器是指选择器的名称前面没有其他选择器,即在组成上,基本选择器是单一名称。 基本选择器主要包括: 元素选择器 ID 选择器 类选择器 伪类选择器 伪元素选择器 通用选择器 元素选...

我的卡
9分钟前
2
0
c直接操作JAVA中的数组

** * jni对数组运算 * 在C中没有创建新的数组副本,直接在原来的java数组上面修改。然后返回了jintArray类型数据 */ JNIEXPORT jintArray JNICALL Java_com_org_vincent_javacallc_JNI_incr...

whoisliang
17分钟前
2
0
简单理解闭包问题

从我16年开始接触前端,知道闭包这个词,已经过去两年了。这两年里,闭包这个概念我在很多地方了解过,却实在没有真的理解,久而久之,变成了一块心病。这不,趁着现在项目告一段落的时间,我...

IrisHuang
17分钟前
3
0
网站漏洞怎么修复对于thinkphp的漏洞修复

THINKPHP漏洞修复,官方于近日,对现有的thinkphp5.0到5.1所有版本进行了升级,以及补丁更新,这次更新主要是进行了一些漏洞修复,最严重的就是之前存在的SQL注入漏洞,以及远程代码执行查询系...

网站安全
18分钟前
1
0
docker 安装oracle11g

1.准备docker环境; 2. docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g --pull 镜像(6个多G) 3.docker run -d -p 1521:1521 -v /data/oracle:/data/oracle --name ora......

xiaoxin
18分钟前
1
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部