黑马程序员技术交流社区

标题: DataReader与DataSet有什么区别? [打印本页]

作者: 许正龙    时间: 2013-3-28 18:58
标题: DataReader与DataSet有什么区别?
本帖最后由 许正龙 于 2013-3-28 21:26 编辑

同是读取数据,什么时候用DataReader什么时候用DataSet呢?哪个更方便?
作者: 苏冉    时间: 2013-3-28 19:06
本帖最后由 苏冉 于 2013-3-28 19:11 编辑

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

DataReader 连接数据库时是面向连接的。读表时,只能向前读取,读完数据后有用户决定是否断开连接。

DataSet保存数据的数据结构;
DataReader不承担保存数据的责任,只负责从数据源读取数据到本地,
它不是数据结构,而是网络通讯组件的高层封装。
所以分布式系统的数据可能会用DataSet做数据载体。

DataSet  和 DataReader对象的区别:
1、DataSet可以离线处理,前后滚动。
   DataReader不能离线处理,且是只读的向前的,不过速度会很快;
2、DataSet可以存储数据库各种对象的,比如表触发器等,
     DataReader只能存储游标记录  ;
3、DataSet可以更新回原来的数据库,DataReader不行;
4、DataSet可以FORWORD   PREVIUS,而DataReader只能FW;   
5、DataReader类似一个只能向前的游标记录集。   
作者: 邓建军    时间: 2013-3-28 19:17
第一种解释
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。
作者: 许正龙    时间: 2013-3-28 20:23
谢谢科普!
作者: coolfeiweb    时间: 2013-3-28 20:53
1、DataSet可以离线处理,前后滚动。
   DataReader不能离线处理,且是只读的向前的,不过速度会很快;
2、DataSet可以存储数据库各种对象的,比如表触发器等,
     DataReader只能存储游标记录  ;
3、DataSet可以更新回原来的数据库,DataReader不行;
4、DataSet可以FORWORD   PREVIUS,而DataReader只能FW;   
5、DataReader类似一个只能向前的游标记录集。  

少量数据用 DataReader 因为快速!大量的而且还要做修改的用DataSet吧!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2