使用DataReader、DataSet、DataAdapter和DataView

  ADO.NET提供两个对象用于检索关系型数据并把它存储在内存中,分别是DataSet和DataReader。DataSet提供内存中关系数据的表现--包括表和次序、约束等表间的关系的完整数据集合。DataReader提供快速、只向前、只读的来自数据库的数据流。

  使用DataSet时,一般使用DataAdapter(也可能是CommandBuilder)与数据源交互,用DataView对DataSet中的数据进行排序和过滤。DataSet可以被继承来建立强化类型的DataSet,用于暴露表、行、列作为强化类型对象属性。

  下面的内容包含什么时候使用DataSet或DataReader,以及怎样优化访问它们所包含的数据,也包括怎样优化DataAdapter和DataView的使用(也包括CommandBuilder)。

  DataSet与DataReader的对比

  在设计应用程序时,决定使用DataSet还是DataReader需要考虑应用程序需要的功能。

  使用DataSet是为了实现应用程序的下述功能:

  l 操作结果中的多个分离的表。

  l 操作来自多个源(例如来自多个数据库、XML文件和电子表格的混合数据)的数据。

  l 在层之间交换数据或使用XML Web服务。与DataReader 不同,DataSet能被传递到远程客户端。

  l 通过缓冲重复使用相同的行集合以提高性能(例如排序、搜索或过滤数据)。

  l 每行执行大量的处理。在使用DataReader返回的行上进行扩展处理将使连接存在的时间比必要的更长,从而降低效率。

  l 使用XML操作(例如XSLT转换和Xpath查询)维护数据。

  在应用程序需要以下功能时使用DataReader:

  l 不需要缓冲数据。

  l 正在处理的结果集太大而不能全部放入内存中。

  l 需要迅速一次性访问数据,采用只向前的只读的方式。

  注意:当填充DataSet的时候,DataAdapter使用DataReader。因此使用DataAdapter代替DataSet获得的性能是节约了DataSet消耗的内存和组装DataSet所需要的周期。这种性能的提高大部分是有名无实的,因此你应该根据需要的功能为基础来做设计决定。

  使用强类型DataSet的好处

  使用DataSet的另一个好处是它能被继承用于建立强类型的DataSet。强类型DataSet的好处包括设计时的检查和强类型DataSet 的Visual Studio .NET语句填充。当你为DataSet固定了大纲或关系结构时,就能建立强类型DataSet,把行和列作为对象的属性而不是项的集合。例如,作为暴露顾客表的某一行的列名的代替,你可以暴露Customer对象的 Name属性。强类型的DataSet衍生自DataSet类,因此不会牺牲DataSet的任何功能,也就是说,强类型的DataSet也可以是远程的,并作为数据绑定控件(例如DataGrid)的数据源提供。如果不知道大纲,也能通过使用通常的DataSet获得好处,但是丧失了强类型DataSet的附加特性。

  在强类型DataSet中处理空值

  使用强类型DataSet时,你能给DataSet 的XML大纲定义语言(XSD)作注解以确保强类型DataSet正确的处理空(Null)的引用。空值(nullValue)注释使你能用String.Empty这个特定值代替DBNull、保持了空引用、或者产生一个异常。选择其中的哪个依赖于应用程序的内容,默认情况下遇到空引用将产生一个异常。

  刷新DataSet中的数据

  如果你希望使用更新后的值从服务器刷新数据集中的值,使用DataAdapter.Fill。如果主键定义在数据表上,DataAdapter.Fill基于主键匹配新行,并把服务器的数据改成已存在的行。被刷新行的RowState设置为Unchanged,即使在刷新前它被修改过。注意如果给数据表定义了主键,DataAdapter.Fill添加新行可能重复主键值。

  如果希望用服务器的当前值刷新一个表,并且保持表中行的改变,你必须首选使用DataAdapter.Fill组合它,填充一个新的数据表,接着将该数据表合并(Merge)进一个数据集,并把preserveChanges值设为true。

  在DataSet中搜索数据

  在一个数据集中查询符合特定条件的行时,使用基于索引(index-based)的查看表将提高性能。给数据表指定主键(PrimaryKey)值时,就建立了一个索引。当为数据表建立数据视图(DataView)时也建立了索引。下面是一些使用基于索引查看的技巧:

  如果查询是在数据表的主键列上进行的,使用DataTable.Rows.Find代替DataTable.Select。

  查询非主键列,可以使用数据视图来提高多个数据查询的速度。当给数据视图添加排序时,将建立搜索时使用的索引。数据视图暴露了查询下层数据表的Find和FindRows方法。

  如果你不是查询表的排序视图,也可以通过为数据表建立数据视图获得基于索引的查看表的好处。注意如果你执行数据上的多个查询这是唯一的好处。如果你只执行单个查询,需要建立索引的过程将因为使用索引而降低了性能。

  数据视图(DataView)结构

  当数据视图建立后,并且当Sort、Ro

使用DataReader、DataSet、DataAdapter和DataView

  ADO.NET提供两个对象用于检索关系型数据并把它存储在内存中,分别是DataSet和DataReader。DataSet提供内存中关系数据的表现--包括表和次序、约束等表间的关系的完整数据集合。DataReader提供快速、只向前、只读的来自数据库的数据流。

  使用DataSet时,一般使用DataAdapter(也可能是CommandBuilder)与数据源交互,用DataView对DataSet中的数据进行排序和过滤。DataSet可以被继承来建立强化类型的DataSet,用于暴露表、行、列作为强化类型对象属性。

  

使用DataReader、DataSet、DataAdapter和DataView相关推荐

  1. Winform开发之ADO.NET对象Connection、Command、DataReader、DataAdapter、DataSet和DataTable简介...

    ADO.NET技术主要包括Connection.Command.DataReader.DataAdapter.DataSet和DataTable等6个对象,下面对这6个对象进行简单的介绍: (1)Co ...

  2. GridView绑定数据源 绑定DataReader /DataSet /DataTable

    有一个GridView1 <asp:GridView ID="GridView1" runat="server"></asp:GridView ...

  3. Asp.net(C#)面试100+题陆续添加中……

    我收集的面试题以及自己对一些面试题的理解: 1.C#不支持多重继承,可以通过接口实现. 2.public 全部公开     private 类内部     protected 自己和自己的子类     ...

  4. 博彦科技面试题-最新(上海)

    As last blog mentioned(中软面试题-最新) ,Some outsourcing company,like chinasoft, beyondsoft, vinceinfo, Hi ...

  5. ASP.net(C#)]用DataSet进入对数据源的插入数据、更新数据及刪除数据

    在ASP中用的最多的就是RecordSet了.RecordSet很容易的实现对数据源的记录插入.更新.删除等操作.而在.net中,已经没有了RecordSet这个概念了. 但.net中的DataSet ...

  6. DataView 构造

    DataView 构造 var data = new vis.DataView(dataset, options) dataset 是 DataSet 或者 DataView. options 是一个 ...

  7. LINQ to DataSet实现复杂数据查询【下】

    Query1-所有学生成绩: 姓名:张三, 数学:80, 语文:75, 英语:78 姓名:王霞, 数学:88, 语文:80, 英语:60 姓名:赵敏, 数学:75, 语文:90, 英语:80 姓名:吴 ...

  8. 使用ADO.NET 的最佳实践(zz)

    数据访问:使用 ADO.NET 的最佳实践(ADO.NET 技术文档) 发布日期: 4/1/2004 | 更新日期: 4/1/2004 摘要:编写 Microsoft ADO.NET 代码的最佳实践, ...

  9. 2010 .NET面试题整理之基础篇

    2010 .NET面试题整理之基础篇 zhuan 开篇语:对于已有工作经验的朋友,也许面试题已显得不怎么重要,但是如果你应聘的还仅仅是个普通的程序员,相信在很多的公司都还是会先拿出一套面试题,可能对整 ...

最新文章

  1. Java高并发编程:原子类
  2. 数据库中的乐观锁与悲观锁详解
  3. [.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用
  4. schur补(schur complement)
  5. Java 获取集合长度
  6. LVS原理详解及部署之四:keepalived介绍
  7. Linux下用ImageMagick将彩色照片转换成黑白照片
  8. 服务器2008r2网络禁止修改,windows-server-2008-r2 – Windows 2008 R2标准服务器 – 如何禁用RC4...
  9. matplotlib常见问题解决方法
  10. 学习笔记 9.22 -9.29 补
  11. 基于mysql的全文索引
  12. 谷歌浏览器显示弹框登陆代理解决方法
  13. php wps 读取word内容,PHP中读取,写入和导出WORD文档的代码总结
  14. SGI STL中内存池的实现 - 内脏坏了 - 博客园
  15. html5 sms短信发送_使用电子邮件免费向手机发送短信(SMS)
  16. linux mysql常用基本操作,Linux下MySQL数据库常用基本操作 一
  17. 棋牌游戏支付接口H5支付宝微信
  18. 优秀的汽车后市场门店应该具备的数字化能力
  19. ArrayList 集合底层实现原理解析
  20. vnpy框架的策略开发和回测逻辑详解---以螺纹钢主力合约的R-breaker日内策略为例

热门文章

  1. Linux 小知识翻译 - 「架构」(arch)
  2. 网络安全渗透--判断网站使用何种网页语言,判断网站所用服务器
  3. Real World Kanban作者访谈
  4. 桌面支持--ZWMECH软件卸载工具
  5. 在winform程序里实现最小化隐藏到windows右下角
  6. cron计划任务使用
  7. SparkSQL ThriftServer 安全相关功能的现状分析
  8. 【教程】Matrikon OPC使用教程连载(四)
  9. 实力封装:Unity打包AssetBundle(大结局)
  10. Saiku_学习_01_saiku安装与运行