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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 阿磊-_- 黑马帝   /  2012-1-12 04:05  /  2994 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

不是说 sqlDataReader是游标,对于读取少量数据带来的只有麻烦吗。但杨老师讲的那个登陆例子读取密码的时候用的就是sqlDataReader。 我想问是用返回一个datatable好还是sqlDataReader读取好呢?  这两者到底该怎么选择使用?

评分

参与人数 1技术分 +1 收起 理由
李荣壮 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 张立 于 2012-1-12 09:35 编辑

DataReader是你取一条的时候才从数据库读一条,一次只在内存在存储一行,数据库记录了你读的指针。而DataSet是数据库一下子把数据读出返回到客户端给你。DataTable把数据存到一块内存区域,当把数据库中的数据读取到DataTable中时,我们在界面上做操作时是对内存表的操作并没有改变数据库表的内容。SqlDataReader为长连接,当连接关闭时将无法再进行读取数据。
MS的建议:
选择 SqlDataReader 还是 DataSet/DataTable,从根本上说是一个注重性能还是注重功能的问题。SqlDataReader 可提供最佳性能;DataSet 可提供额外的功能和灵活性。
在下列情况下,请使用由 SqlDataAdapter 对象填充的 DataSet:  
• 您需要不连续的内存驻留型数据缓存,以便可以将其传递给应用程序内的其他组件或层。  
• 您需要数据在内存中的关系视图,以便进行 XML 或非 XML 操作。  
• 您要处理从多个数据源(如多个数据库、表或文件)中检索到的数据。  
• 您希望更新检索到的全部或部分行,并且使用 SqlDataAdapter 的批量更新功能。  
• 您希望对其执行数据绑定的控件需要支持 IList 的数据源。  

在下列情况下,请使用通过调用 SqlCommand 对象的 ExecuteReader 方法得到的 SqlDataReader:  
• 您要处理大量的数据 — 多得难以在单个缓存中进行维护。  
• 您希望减少应用程序的内存使用量。  
• 您希望避免与 DataSet 相关联的对象创建开销。  
• 您希望用对实现了 IEnumerable 的数据源提供支持的控件执行数据绑定。  
• 您希望简化和优化数据访问。  
• 您要读取的行包含二进制大对象 (BLOB) 列。您可以使用 SqlDataReader 在可管理的块区中将 BLOB 数据从数据库中提取出来,而不是一次将其全部提取出来。有关处理 BLOB 数据的详细信息,请参阅本文档中的处理 BLOB 一节。

评分

参与人数 1技术分 +3 收起 理由
李荣壮 + 3

查看全部评分

回复 使用道具 举报
SqlDataReader是从数据库中读取数据的一个对象,要是用它调用数据得先经过SqlCommand对象中ExecuteScalar方法将当前的CommandText发送到当前的Connection并生成一个SqlDataReader.
而DataTable是内存中数据的一个表格,很多的DataTable形成一个DataSet(数据集)相当于一个临时数据仓库,需要SqlAdapter中的Fill方法填充.
我感觉应该读取数据较快的话用SqlDataReader 和存储过程比较快

评分

参与人数 1技术分 +1 收起 理由
李荣壮 + 1

查看全部评分

回复 使用道具 举报
1、SqlDataReader类似于数据库中的游标,也可以想象成C、C++中的指针,每读一条数据,向下移动一次,知道数据读取完毕。另外,最重要的是它是基于连接的。读取大量数据时通常会用它。
2、DataTable是数据表。适合用于读取少量数据,它不是基于连接的。
3、没那么麻烦,小数据量就用DataTable,大数据量就用SqlDataReader。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马