ADO.NET入门教程(八) 深入理解DataAdapter(上)

摘要

ADO.NET有两个核心组件:基于连接的Data Provider组件以及基于非连接的DataSet组件。基于连接的Data Provider组件常用于实时地从数据库中检索数据。而基于非连接的DataSet,似乎与数据库没有直接联系,仅仅用于在本地内存中存储Data Provider提供的数据表或集合。这一切似乎很微妙,此时,你是否在想:这两大组件是如何联系在一起的呢?或许,通过阅读本文会或多或少解除你的一些疑惑呢!


目录


1. 认识DataAdapter

前面我所讲的对象中,譬如Connection对象,Command对象以及DataReader对象,这些对象均属于Data Provider的一部分,而且都是基于连接的。拥有强大功能的它们,让你可以很轻松地连接一个特定的数据源,执行SQL语句,检索只读的数据流等等。这些基于连接的对象都对应于特定的数据源。换句话说,对于不同的数据源,我们需要找到对应的数据库提供程序(Data Provider)来匹配他们。当然,你也不必为此感到困惑和紧张,在前面我已经讲得很详细了。或许,以目前我们所学的知识,对于操作数据源以及检索数据完全没有什么问题呢!但是,这并没有发挥出ADO.NET的优势。如果,每次我们检索数据库中的表或者行都需要连接一次数据库,那么性能和效率是十分低下的。实际上,ADO.NET提供了基于非连接的核心组件:DataSet。DataSet组件让我们可以很愉快地在内存中操作以表为中心的数据集合,就好比操作数据库中的表一样。这是多么让人兴奋和激动啊!

不知道大家有没有想过这样一个问题(反正我是想了):既然DataSet是基于非连接的(不需要连接数据库),那么它存储的数据集合是从哪里来呢?实际上,很多时候,它的数据还是来自于数据库。Oh!这似乎有点自相矛盾了!打个“不雅”的比喻:就好比没有鸡,那哪来的蛋呢?你不妨换个角度来思考问题!虽然,你没有养鸡,但是,你不是还可以从超市或者其他零售店买到鸡蛋吗?同理,尽管DataSet没有直接连接数据库,但是,ADO.NET早就为DataSet准备了一位非常谦虚友善的中介:DataApdater。DataApater数据适配器,就是这样一个对象:它为外部数据源与本地DataSet集合架起了一座坚实的桥梁,将从外部数据源检索到的数据合理正确的调配到本地的DataSet集合中

2. DataAdapter的工作原理

要说DataAdapter是ADO.NET世界里最为复杂的部分,其实也不为过!但是,我们也不必惊慌。尽管DataAdater内部实现机制较为复杂,但是提供开发人员的接口却是异常的简单。我们知道,DataApapter本质上就是一个数据调配器。当我们需要查询数据时,它从数据库检索数据,并填充要本地的DataSet或者DataTable中;当我需要更新数据库时,它将本地内存的数据路由到数据库,并执行更新命令。下面我们以Customer表为例,来理解DataAdapter的工作原理。下图详细描述了一个DataAdapter的工作过程。

                  图2.1  DataAdapter执行过程图

从上图我们可以清楚的知道,当我查询Customer信息,DataAdapter首先将构造一个SelectCommand实例(本质就一个Command对象),然后检查是否打开连接,如果没有打开连接则打开连接,紧接着调用DataReader接口检索数据,最后根据维护的映射关系,将检索到得数据库填充到本地的DataSet或者DataTable中。同理,我们需要更新数据源时,DataAdatper则将本地修改的数据,跟据映射关系,构造InsertCommand,UpdateCommnad,DeleteCommand对象,然后执行相应的命令。

之所以说,DataAdapter是最复杂的ADO.NET组件,是因为它是架构在所有其他DataProvider对象之上的。Connection对象,DataReader对象,Paramter对象以及Command对象,都尽可能的为它服务。总体来说,DataAdapter主要有三大功能:

  • 数据检索:尽可能用最简单的方法填充数据源到本地DataSet或者DataTable中。细致的说,DataAdapter用一个DataReader实例来检索数据,因此你必须提供一个Select查询语句以及一个连接字符串。
  • 数据更新:将本地修改的数据返回给外部的数据源相对来说稍微复杂一点。即使,从数据库查询数据时,我们仅仅只需要一条基本的Select语句,而更新数据库则需要区分Insert,Update,Delete语句。
  • 表或列名映射:维护本地DataSet表名和列名与外部数据源表名与列名的映射关系。

3. 说说DataAdapter的重要成员

作为.NET DataProvider对象成员之一,DataAdapter跟其他数据提供对象具有相似的特征:都是基于连接的,都继承于基类,不同的数据源都对应自己的派生版本。这样理解的话,学习DataAdapter似乎简单的多。DataAdapter的基类是DBDataAdapter,它的结构如下:

public abstract class DbDataAdapter : DataAdapter,     IDbDataAdapter, IDataAdapter, ICloneable

从上面我们可以看到,DBDataAdapter是一个抽象基类,不能被实例化,并且继承DataAdapter类,IDBDataApdater,IdataAdapter以及Icloneable接口。DataAdapter成员较多,必须掌握的有以下几种:

  • SelectComand属性:获取或设置用于在数据源选择记录的命令。
  • UpdateCommand属性:获取或这只用于更新数据源中的记录的命令。
  • DeleteCommand属性:获取或设置用于从数据源中删除记录的命令。
  • InsertCommand属性:获取或设置用于将新记录插入数据源中的命令。
  • Fill方法:填充数据集。
  • Update方法:更新数据源。

4. 总结

本文我主要从"WHY"与"WHAT"的角度详细讲解了DataAdapter的工作原理以及主要作用。后续的文章,我将围绕"HOW"来详细分析DataAdapter的实际应用。如果文章对园友们有帮助,希望能得到您的推荐关注。您的肯定和支持是我继续写作的最大动力!

文章转载于:http://liuhaorain.cnblogs.com

时间: 2024-11-04 09:37:17

ADO.NET入门教程(八) 深入理解DataAdapter(上)的相关文章

你必须知道的ADO.NET(九) 深入理解DataAdapter(下)

摘要 由于各种原因,很久没有更新博客了!期间,几分迷茫,几分失落.令人欣慰的是,园子里还有很多热心的读者,都期待我更新博客.想到自己的文章,能对园友有所帮助,我又重拾久违的文笔,娓娓道来,朴实而不做作.在上一篇文章<你必须知道的ADO.NET(八) 深入理解DataAdapter(上)>中,我主要介绍了DataAdapter的工作原理以及基本功能.在本文中,我将通过实例的方式讲解如何使用DataAdapter对象. 目录 如何构造一个DataAdapter对象? 填充数据到DataSet 总结

Spring Cloud 入门教程(八): 断路器指标数据监控Hystrix Dashboard

1. Hystrix Dashboard (断路器:hystrix 仪表盘)  Hystrix一个很重要的功能是,可以通过HystrixCommand收集相关数据指标. Hystrix Dashboard可以很高效的现实每个断路器的健康状况. 1). 在Ribbon服务g和Feign服务的Maven工程的pom.xml中都加入依赖 1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <art

ADO.NET入门教程(二)了解.NET数据提供程序

摘要 在上一篇文章<你必须知道的ADO.NET(一) 初识ADO.NET>中,我们知道ADO.NET的两大核心组件分别是Data Provider和DataSet.如果说DataSet是ADO.NET的心脏,那么Data Provider绝对是ADO.NET的左臂右膀.Data Provider提供了访问外部数据数据源的可能性,而且外部的数据源是多样的.本文将详细说明.NET数据提供程序的作用以及如何访问不同的数据源. 目录 什么是.NET数据提供程序? .NET数据提供程序的核心对象 其他重

ADO.NET入门教程(三) 连接字符串,你小觑了吗?

摘要 ADO.NET强大的优势在于对不同的数据源提供一致的访问.在上一篇文章<你必须知道的ADO.NET(二)了解.NET数据提供程序>中,我们知道.NET对不同数据源,使用不同的数据提供程序,这使得我们可以更高效的访问相应的数据源.除了.NET数据提供程序外,我还得说说另外一位功臣:连接字符串(Connection Strings),它也为ADO.NET在解决"不同"与"一致"的矛盾中,贡献出了非常重要的力量. 目录 什么是连接字符串? 理解语法格式

ADO.NET入门教程(五) 细说数据库连接池

题外话 通过前几章的学习,不知道大家对ADO.NET有一定的了解了没有.撇开文章质量不讲,必须肯定的是,我是用心去写每一篇文章的.无论是是在排版上,还是在内容选取上我都花了不少心思.我希望通过本系列文章,无论是新手还是老手,在ADO.NET上都能有所收获.如果大家觉得有帮助,我希望能得到您的推荐和关注,让我知道您对我的肯定.如果大家觉得我写的不好,我也很乐意听取批评的意见,让我们一起进步. 摘要 今天我要讲的是数据库连接池.说实话,我表示鸭梨很大.因为相比其他章节来说,连接池相对来说难理解一点.

ADO.NET入门教程(一) 初识ADO.NET

摘要 作为.NET框架最重要的组件之一,ADO.NET扮演着应用程序与数据交互的重要的角色.本文将从宏观的角度来探讨ADO.NET,和大家一起了解ADO.NET来龙去脉以及ADO.NET的主要组成部分. 目录 什么是ADO.NET? 理清ADO.NET与ADO的关系 认识ADO.NET最核心的组成部分 ADO.NET扩展 1. 什么是ADO.NET? 简单的讲,ADO.NET是一组允许.NET开发人员使用标准的,结构化的,甚至无连接的方式与数据交互的技术.对于ADO.NET来说,可以处理数据源是

ADO.NET入门教程(四) 品味Connection对象

摘要 前几篇文章,我都没有详细讲解Data Provider核心对象,因为我希望在讲解这些对象之前,让大家对一些基础的概念有很好的认识.在上一篇文章<你必须知道的ADO.NET(三) 连接字符串,你小觑了吗>中,我详细讲解了连接字符串,相信大家都和我一样意识到它的重要性了.如果说连接字符串是打开数据源大门的钥匙,那么我今天要讲解的则是如何用这把钥匙打开数据源的大门.作为Data Provider的第一核心对象,Connection对象肩负起连接数据源的重任.下面就让我们好好认识这位重量级人物吧

ADO.NET入门教程(六) 谈谈Command对象与数据检索

摘要 到目前为止,我相信大家对于ADO.NET如何与外部数据源建立连接以及如何提高连接性能等相关知识已经牢固于心了.连接对象作为ADO.NET的主力先锋,为用户与数据库交互搭建了扎实的桥梁.它的一生是平凡而又伟大的,总是尽自己最大的努力为用户搭建一条通往数据库的平坦大道.相比连接对象来说,Command对象似乎耀眼的多.Command对象在ADO.NET世界里总是忙忙碌碌,它就像一个外交官,为用户传达了所有操作数据库的信息. 目录 准备 什么是Command对象? 必须掌握的几个属性 必须掌握的

linux入门教程(八) Linux磁盘管理

[查看磁盘或者目录的容量 df 和 du] df 查看已挂载磁盘的总容量.使用容量.剩余容量等,可以不加任何参数,默认是按k为单位显示的 df常用参数有 –i -h -k –m等 -i 使用inodes 显示结果 -h 使用合适的单位显示,例如G -k -m 分别为使用K,M为单位显示 简单介绍一下,你看到的相关数据.Filesystem 表示扇区,也就是你划分磁盘时所分的区:1K-blocks/1M-blocks表示以1K/1M为单位:Used 和 Available 分别是已使用和剩余:Us