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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张青江 中级黑马   /  2012-9-15 14:52  /  2131 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

同样都是去数据,为什么有的人用DataReader,有的人用DataSet呢?

评分

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

查看全部评分

9 个回复

正序浏览
DataReader是把数据读从数据库中一条一条的读出来,只读并且是连接方式的是从数据库取出。
Dataset是从数据中把整个你要读的放到内存中放好后数据就会断开,可以操作的,但操作的是内存中的数据。
如果想取某一表的一天数据或几条数据用Dataset就太浪费资源了。
如果想取所有数据并对数据进行操作时,还是要用Dataset比较舒服的。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
陈育梅 发表于 2012-9-15 14:59
DataReader:只读方式,这时别的客户不能访问Connection,速度快.
Dataset:内存中的表的集合,可以在内存修 ...

你还有要补充的吗?
回复 使用道具 举报
我的理解是,dataReader是只向前的数据流,施行后查出的数据只是一条,
通常在查询某一条记录的时候用到。
而dataset是一个表单,查出的数据是以表的形式查询出来的,
所以就适合GridView展示表中的所有信息,和模糊查询一些信息,但也能完成DataReader的功能,
但可能需要的空间较多。
所以要查一条记录用DataReader,查多条表单式的用Dataset.

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
DataReader数据读取器是一种面向连接的数据访问方式,它在执行的过程中要求保持连接的打开,有只读、向前两大特点,我认为一般用在需要大量读取数据的情况下;
DataSet是储存在内存中的数据集合,一般用在数据操作频繁的地方,个人理解而已。。

评分

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

查看全部评分

回复 使用道具 举报
. 获取数据的方式
    DataReader为在线操作数据, DataReader会一直占用SqlConnection连接,在其获得数据过程中其它操作不可以再使用SqlConnection连接对象。
    DataSet为离线操作数据,DataSet会将数据一次性读入内存,然后断开连接,这时其它操作就可以使用SqlConnection连接对象。
    由于DataReader一次只读取一行数据,所以占用内存较小。但DataReader为只进且只读的,也就是只能单方向向前读取,如果你想回头去读取上一条数据是不允许的,并且不允许其修改数据。
    由于DataSet一次性读取所有数据,所以比较消耗资源,但也提高了灵活性,在断开数据库连接情况下你可以对数据进行任何增删改查,按照任意的顺序读取数据,并可以将其写回到数据库。
    有一点需要注意,DataReader一次读取一行并不意味了着这时在数据库中的数据被修改,可以读到新的数据,这是数据库层面的保护.
2.获取数据的机制
    DataReader是通过IDbCommand.ExecuteReader来读取数据。
    DataSet则是通过DbDataAdapter.Fill来填充数据
    所以DataReader在获取数据时不能关闭连接。而DataSet则可以,因为DbDataAdapter已经将数据读取到应用程序服务器中,所以在使用DataReader时一定要注意,及时关闭连接。
3.其它区别
    DataReader读取速度快于DataSet
    DataReader是数据提供者类,DataSet是一般性类,借助于DbDataAdapter来填充数据。
    因为DataSet是离线操作数据,所以在事务中使用锁时要注意,因为DataSet填充数据后会断开连接,也就会释放锁。


这个或许你更容易懂,,这就是论坛里别人问过的问题哦

评分

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

查看全部评分

回复 使用道具 举报
http://www.cnblogs.com/wanderer/articles/1457792.html 网上找的这是两个的比较,可以看一下
回复 使用道具 举报
DataReader:只读方式,这时别的客户不能访问Connection,速度快.
Dataset:内存中的表的集合,可以在内存修改.连接后就与Connection断开,

评分

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

查看全部评分

回复 使用道具 举报
简单说就是:   
  DataSet:数据集。一般包含多个DataTable,用的时候,dataset["表名"]得到DataTable   
   
  DataTable:数据表。   
  一:   
  SqlDataAdapter da=new SqlDataAdapter(cmd);   
  DataTable dt=new DataTable();   
  da.Fill(dt);   
   
  -----------------   
  直接把数据结果放到datatable中,   
  二:   
  SqlDataAdapter da=new SqlDataAdapter(cmd);   
  DataSet dt=new DataSet();   
  da.Fill(dt);   
  ----------------   
  数据结果放到dataset中,若要用那个datatable,可以这样:dataset[0]   
  更常见的用法:   
  SqlDataAdapter da=new SqlDataAdapter(cmd);   
  DataSet dt=new DataSet();   
  da.Fill(dt,"table1");   
  用的时候:这样取datatable:   
  dataset["table1"]   
   


DataSet不能直接用来存储数据,如果仅用DataSet,它会自动的生成一个DataTable,所以看上去就像一个DataTable。   
   
  如果有很多个DataTable需要同时绑定到某个控件,就可以把多个DataTable添加到一个DataSet中,分别起不同的名字就可以了Top
DataReader基于连接,它返回的数据是只读只向前的,适合简单地浏览且耗时比较短的操作。DataSet对象会将所需数据读入内存然后断开连接。它适合对数据进行复杂长时间的操作,并且需要更新数据的情况。Top

SqlDataReader只是建立与数据库之间的类似于一个指针关系,在没有调用Read()方法之间它不从数据读出任何数据,而在调用Read()时也只是从数据库中读出一条数据.DATATABLE是数据表的一个复本,至于DataSet可以反它看作一个数据库,因为它不但可以包括多个表而且还能包括各表之间的关系.所以在进行大量数据访问时(特别是分页方式的访问)建议使用SqlDataReader,这样可以节省大量的内存开销.Top

DataSet就像内存数据库,   
  DataTable就是表,   
  库可以包含多个表,也可以包含表之间的关系。

评分

参与人数 1技术分 +2 收起 理由
郑文 + 2

查看全部评分

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

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

分布式系统的数据可能会用dataset做数据载体,因为dataset是保存数据的数据结构,而DataReader不承担保存数据的责任,它只负责从数据源读取数据到本地而已,它不是数据结构,而是网络通讯组件的高层封装。 DataAdapter也只是使用DataReader从数据源读取数据并Add到dataset保存起来而已。假如我们单独使用DataReader也可以把数据写入到业务类或者dataset里。那只是根据业务需要而选择不同的数据载体而已。实际上我们从数据库获得数据都会通过DataReader,只不过DataAdapter把这一切都封装起来了

dataset 和 datareader对象有什么区别?
DataSet可以离线处理,前后滚动.DataReader不能离线处理,且是只读的向前的,不过速度明显会很快 DataSet可以存储数据库各种对象的,比如表触发器等,而DataReader只能存储游标记录
DataSet可以更新回原来的数据库,DataReader不行;  
DataSet可以FORWORD     PREVIUS,而DataReader只能FW;  
DataReader类似一个只能向前的游标记录集  
DataSet叫数据集!是ADO.net相对与ADO实现断开式数据库连接性的主要体现!DateReader是一个客户端的只向前游标,两者的应用领域不同!读取数据后!如果要进行比较频繁的改动,可以使用DataSet,并且DataSet也支持串行化,可与xslt结合!进行web开发!  
DataReader则偏向于快速读取数据!针对数据量比较大的数据可能应用的更加频繁点! <[三]>ADO.NET提供以下两个对象,用于检索关系数据并将其存储在内存中:DataSet和DataReader。DataSet提供一个内存中数据的关系表示形式,一整套包括一些表在内的数据(这些表包含数据、对数据进行排序并约束数据),以及表之间的关系。DataReader提供一个来自数据库的快速、仅向前、只读数据流。

当使用DataSet时,经常会利用DataAdapter(也可能是CommandBuilder)与数据源进行交互。当使用DataSet时,也可以利用DataView对DataSet中的数据应用排序和筛选。也可以从DataSet继承,创建强类型DataSet,用于将表、行和列作为强类型对象属性公开。

评分

参与人数 1技术分 +2 收起 理由
郑文 + 2

查看全部评分

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