DataRead和DataSet的异同

news/2024/7/8 12:41:08

第一种解释

DataReader和DataSet最大的区别在于,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在大部分应用场景下也是有自己优点的,比如充分解耦、一次操作、领域模型操作等。

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

转载于:https://www.cnblogs.com/liuhuimh/p/7221618.html


http://www.niftyadmin.cn/n/2751128.html

相关文章

LeetCode Valid Parentheses

LeetCode解题之Valid Parentheses 原题 推断一个仅仅包括各种括号符号的字符串中括号的匹配情况。 注意点: 字符串中仅仅会包括”(“,”)”,”[“,”]”,”{“,”}”这些字符括号匹配要注意顺序,字符串”([)]”是错误的匹配样例: 输入: s”()…

参对象和map_AI论技| mAP提升40%,更快更精准的YOLO来了!还支持实例分割?!

不久前给大家详细介绍了经典的目标检测算法yolov3,最近基于yolov3的改进版本poly-yolo来了,模型参数量仅为yolov3的60%,但是map却提升了40%,还能应用于实例分割,一起来看看细节和其惊人的效果吧!本文由品览…

如何搭建FTP服务器

7分步阅读FTP服务器可以方便的供用户上传,下载文件,对于我们日常的教学,工作都有着很大的帮助,今天小编就为大家讲解下如何在搭建FTP服务器希望对大家有所帮助。工具/原料电脑一台方法/步骤1首先我们创建一个用户账户用于登录FTP进…

c语言和python实用性_C语言和Python语言,那个更好?

(3)灵活性Python语言的最大优点在于它的灵活性,这在测试领域非常重要,因为测试所面临的业务和需求经常在变化,有时它们甚至无法满足并自行决定,而在这时,你可以使用Python丰富的第三方库轻松找到解决方案。(4)扩张Pyth…

HDU 4401 Battery(积分)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid4401 题意:给出一个长度为L的太阳能电池板。若阳光直射在板上,单位长度单位时间发电为1.斜射的话要乘以sin(x),x为阳光和地面夹角。求某一时间段太阳能电池板的发电量。 思路&#xff1a…

趣谈网络原理 网关(自我提升第二十四天)

第一,菜鸟感觉这个极客时间的专栏因为是每天挑一个学,然后写博客,感觉顺序比较乱,我今天整理了一下。 第二,菜鸟感觉这些东西真的是:一天不学,等于白学。我才几天没看这个趣谈网络原理&#xf…

还原历史版本_历史还原的“音乐事件” | 乐评

江禹杉文 | 张俊俊2020年12月16日晚,青年羽管键琴家、管风琴家江禹杉在中国音乐学院举行的《羽管键琴独奏音乐会巴赫——哥德堡变奏曲》(BWV988),可谓一场巴洛克音乐的“历史还原”之旅。作为一名旅欧羽管键琴家、管风琴家,江禹杉丰富的教堂演…

topcoder srm 445 div1

problem1 link 这个的结论是只需要考虑坐标是整数或者是整数.5,比如(2.5,3),(4,3.5),(1.5,4.5)这样的时候。这个详细证明起来应该挺麻烦的。这里有一些讨论。 problem2 link 首先,可以暴力看下$n3,4$时的情况。 $n3$, 000 001 011 010 110 100 101 111 $…