A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 石国庆 中级黑马   /  2013-3-15 12:44  /  1464 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

DataReader 和DAataSet有什么区别啊?具体点

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

7 个回复

倒序浏览
       入学前自学视频的ADO.Net教程中,老师用到过DataReader,对这两者也没深入的介绍,应该不是什么重点。
两者都能从数据源读取数据,但区别很大:
1、dataset可以认为是一个虚拟的数据库,里面存着你的tables数据表,而你的数据就保存在数据表中;而datareader就可以理解为是一个一直连着数据库的管道。
2、DataReader的执行过程不能脱离数据库连接,也就是在DataReader读取数据的时候不能够使用IDbConnection.Close()方法关闭数据库连接;而在使用DataSet获取数据时,可以断开数据库的连接,因为此时DbDataAdapter已经负责将数据获取到应用服务器中了。
3、DataReader本身是通过IDbCommand.ExecuteReader()方法进行构建的;而DataSet则是通过DbDataAdapter.Fill()方法进行填充。
4、DataReader只能正向读取数据,不能修改数据;DataSet可以按任何顺序读行,可以按灵活的方式搜索、排序和过滤这些行,甚至可以改变这些行,然后将这些改变同步到数据库中。
5、在使用DataReader获取数据后,应该主动地关闭数据库连接,否则可能出现数据库连接池溢出的异常。

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

回复 使用道具 举报
  可以将DataSet看作一个离线的数据库,将数据库中的数据在内存中作映射。当你有很多客户端来访问同样的数据时,你可以让这些客户端从DataSet中读取数据。DataReader操作时,需要将Connection对象打开,与数据库保持连接,它与DataSet相反过来,它还的特点就是只读向前,所以当你读取很量数据时,可以使用DataReader。

  前者DataSet是用来从数据库中读取数据的.面后者DataReader是用来接受读出来的数据并进行保存在内存中.前者DataSet一但读完.数据就不能再访问,后者DataReader是可以较持久访问的.而且还可以把它当作数据表一样做很多的查询运算.
  在一般的状况下,DataReader 的速度不仅比 DataSet 来得快,在 IIS 服务器上所使用的内存也较少。因为DataReader 每次只是读取一行数据到内存中.。我们的建议是,如果您的数据来源控件只是用来填入控件的清单成为其选项,亦或是您的数据绑定控件并不需要提供排序或分页功能的话,则应该使用 DataReader。反之,如果您的数据绑定控件需要提供排序或分页功能的话,则必须使用 DataSet 并承担其各项负面效应。
   DataReader
   速度较快
   不支持快取、分页与动态排序。
   DataSet
   支持快取、分页与动态排序
   速度较慢

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

回复 使用道具 举报
DataSet可以看作是一个离线的小型数据库,但这里边的数据是存放在内存中的。当你有很多客户端来访问同样的数据时,你可以让这些客户端从DataSet中读取数据。
DataReader读取数据库中的数据时需要与数据库保持连接状态,它提供只读向前的游标,所以当你读取很多数据时,可以使用DataReader。
回复 使用道具 举报
dataset表示一个数据集,是数据在内存中的缓存。 可以包括多个表
DatSet 连接数据库时是非面向连接的。把表全部读到Sql中的缓冲池,并断开于数据库的连接
你看看这个
http://www.cnblogs.com/jiahaohk/articles/1546864.html
回复 使用道具 举报
问题解决以后 把问题改为 “已解决”
回复 使用道具 举报
来学习学习
回复 使用道具 举报
在操作数据库的类中,有几个是非常重要的,SqlConnection,SqlCommand,SqlDataReader 这三个类是必须掌握且熟练的
而DataSet,DataTable,SqlDataAdapter ...这几个类相对来说不是那么重要,会用就行。
SqlDataReader是由SqlCommand对象的.ExecuteReader()返回的一个游标或者说是指针。
SqlDataReader从数据库中逐行读取数据到客服端,是连着数据库的,一旦数据库连接断开,则SqlDataReader不能读取数据而抛异常。

而DataSet可以看做是内存级别的数据库,是存在于内存中的,与数据库服务器没半点关系。只要操作完成,即使断开了连接,也不影响从中读取数据。
SqlDataReader读数据快,但是占用数据库链接通道。
DataSet虽然方便,但如果是大数据量读取,得考虑内存是否足够大,性能也没有SqlDataReader高。
所以,看情况取舍。


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马