趣味理解ADO.NET对象模型
为了更好地理解ADO.NET的架构模型的各个组成部分,我们可以对ADO.NET中的相关对象进行图示理解,如图所示的是ADO.NET中数据库对象的关系图。

讲究完关系图后,为了加深大家的理解,我们可以用趣味形象化的类比理解ADO.NET对象模型的各个部分,如图所示,可以看出这些对象所处的地位和对象间的逻辑关系。

对比ADO.NET的数据库对象的关系图,我们可以用对比的方法来形象地理解每个对象的作用,如上图所示。
1. 数据库好比水源,存储了大量的数据。
2. Connection对象好比伸入水中的进水笼头,保持与水的接触,只有它与水进行了“连接”,其他对象才可以抽到水。
3. Command对象则像抽水机,为抽水提供动力和执行方法,通过“水龙头”,然后把水返给上面的“水管”。
4. DataAdapter、DataReader对象就像输水管,担任着水的传输任务,并起着桥梁的作用。二者有什么区别呢?后面将详细介绍。
5. DataSet数据集则是一个大水库,把抽上来的水按一定关系的池子进行存放。即使撤掉“抽水装置”(断开连接,离线状态),也可以保持“水”的存在。这也正是ADO.NET的核心。
6. DataTable数据表则像水库中的每个独立的水池子,分别存放不同种类的水。一个大水库由一个或多个这样的水池子组成。
进水笼头——建立Connection
Connection表示与数据源之间的连接。可根据Connection对象的各种不同属性来指定数据源的类型、位置及其他属性,可用它来与数据库建立连接或断开连接。对于不同类型的水库,进水笼头规格和型号也不同,.NET Framework数据提供程序也有不同的Connection,如针对SQLServer的SqlConnection、针对Oracle的OracleConnection、针对MySQL的MySqlConnection、针对OLEDB的OleDbConnection等。
抽水机——Command
Command对象封装了与用户想要完成的动作相关的数据库命令,在一般情况下这些命令就是SQL语句。抽水机为了方便使用,提供了3个常用的抽水方法
1. ExecuteReader返回DataReader对象,包括一行或多行数据。
2. ExecuteNonQuery对Connection执行SQL语句,并返回受影响的行数,多用于INSERT、UPDATE、DELETE、CREATE等操作
3. ExecuteScalar返回单个值。返回结果集中第一行的第一列。忽略额外的列或行。
输水管——DataAdapter
DataAdapter提供连接DataSet对象和数据源的桥梁。DataAdapter使用Command对象在数据源中执行SQL命令,以便将数据加载到DataSet中,并使DataSet中数据的更改与数据源保持一致。DataAdapter就像一根输水管,通过发动机,把水从水源输送到水库里进行保存。
输水管——DataReader
通过执行ExecuteReader方法可以返回一个DataReader对象。DataReader以只进、只读方式返回数据,从而提高应用程序的性能。这样可以节省DataSet所使用的内存,并省去创建DataSet并填充其内容所需的处理。
DataReader也是一种水管,和DataAdapter不同的是,DataReader不把水输送到水库里面,而是单向地直接把水送到需要水的用户那里或田地里,所以要比经过水库中转一下更快。
为了获得更佳的输水性能,完成输水之后一定要关闭DataReader。如果使用Connection只返回DataReader,那么关闭DataReader之后立刻关闭它。另外一个显式关闭Connection的方法是将CommandBehavior.CloseConnection传递给ExecuteReader方法,以确保关闭DataReader时相应的连接也被关闭。特别是我们从一个方法返回DataReader,而且无法控制DataReader的相关连接是否关闭,则使用CommandBehavior.CloseConnection特别有用。
随用随关,释放资源
对于C#程序员来说,确保始终关闭Connection和DataReader对象的一个方便的方法就是使用using语句。using语句在离开自己的作用范围时,会自动调用“全自动安全阀”自动关闭相应的对象。例如:
using(SqlConnection myConnection=newSqlConnection(connectionString))
{
SqlCommandcmd=myConnection.CreateCommand();
cmd.CommandText="SELECT*FROMP_Product";
myConnection.Open();
using(SqlDataReader dr=cmd.ExecuteReader())
{
//使用SqlDataReader的代码略
}/离开了这个范围自动关闭SqlDataReader对象Dr
}//离开了这个范围自动关闭myConnection
水库管理——DataSet
DataSet是ADO.NET中最核心的成员之一,是各种基于.NET平台程序语言的数据库应用程序开发最常接触的类,这是因为DataSet在ADO.NET实现从数据库中抽取数据的作用。数据抽取后,DataSet就是数据的存放地,它是各种数据源(SQLServer、OLEDB等)的数据在计算机内存的缓存,所以有时说DataSet可以看成是一个数据容器(又称数据集)。在客户端通过对DataSet的数据集读取、更新等操作,从而实现对数据源的同等操作。
DataSet的最大优点是离线和连接。DataSet既可以以离线方式,也可以以实时连接方式来操作数据库中的数据。这样的好处是大大减少了服务器端数据库的连接线程,从而大大地减少了服务器端的运行压力。所以,在数据量不大的情况下,使用DataSet是最好的选择。
DataSet的基本工作过程:应用程序一般并不直接对数据库进行操作,而是先完成和数据库的连接,接着通过数据适配器(DataAdapter)把数据库中的数据填入DataSet对象,然后客户端再通过读取DataSet来获得需要的数据,同样,在更新数据库中的数据时,也是首先更新DataSet,然后再通过DataSet和数据适配器将更新的数据同步地解释入数据库中。
水池子——DataTable
每一个DataSet都是一个或多个DataTable对象的集合,这些对象由数据行(DataRow)、数据列(DataColumn)、字段名(ColumnName)、数据格(Item),以及约束(Constraint)和有关DataTable对象中数据的关系(Relations)组成。我们要使用的时候,必须知道我们要使用哪个水池子中的水,代码是DataSet对象.DataTable[“水池子名称”]。
以上通过抽水过程类别讲解了ADO.NET对象模型,通过对比相信大家明白了这几个对象是如何相互配合来操作数据的。
趣味理解ADO.NET对象模型的更多相关文章
- ADO.NET对象模型之间的关系
ADO.Net支持两种访问数据的模型:无连接模式和连接模式 无连接模式将数据下载到客户机器上,并在客户机上将数据封装到内存中, 可以向访问本地关系数据库一样访问内存中的数据(例如DataSet), 连 ...
- APS.NET MVC + EF (02)---深入理解ADO.NET Entity Framework
2.7 深入理解Entity Framework 性能问题几乎是一切ORM框架的通病,对于EF来说,引起性能低的原因主要在以下几个方面. 复杂的对象管理机制为了在.NET中更好地管理模型对象,EF提供 ...
- ADO.NET对象模型
ADO.NET建立在NetFramwork一些核心类的基础之上,可以将这些类分为两组:用于包含于管理数据的容器类与用于连接特定数据源的控制类. 容器类是通用的,无论使用什么样的数据源,都可以使用相同的 ...
- 关于理解《C++ 对象模型》中:把单一元素的数组放在末尾,struct可以拥有可变大小的数组
这一章在第19页,写的好深奥,我竟然没看明白在说什么--之后再看了几遍,终于明白了. 原文: C程序员的巧计有时候却成为c++程序员的陷阱.例如把单一元素的数组放在一个struct的末尾,于是每个st ...
- IOC趣味理解
假设一个场景: 假设你是一个四岁孩子,饿了,想吃东西.怎么做? 1,哪有吃的去哪拿,你知道冰箱有吃的,你去冰箱拿〉会有风险.比如,拿了生的吃的,吃坏肚子,甚至拿了不能吃的东西. 2, 找父母(IO ...
- net 数据库连接详解 相当经典啊
ADO.NET与抽水的故事 ADO.NET是微软新一代.NET数据库的访问架构,ADO是ActiveX Data Objects的缩写.ADO.NET是数据库应用程序和数据源之间沟通的桥梁,主要提供一 ...
- VBA对象模型(2)
Excel对象模型简介 在介绍Excel对象模型之前,让我们先来看一个简单的例子.大多数工厂都是按这样的结构进行设置的:最上层为工厂总部,第二层次分为各个车间,在车间下面又分各班组.就这样组织在一起, ...
- ADO.NET数据库
ASP.NET提供了ADO.NET技术,它是ASP.NET应用程序与数据库进行交互的一种技术. ADO.NET技术把对数据库的操作分为几个步骤,并为每个步骤提供对象来封装操作过程,从而使对数据库的操作 ...
- C# 6 与 .NET Core 1.0 高级编程 - 37 章 ADO.NET
译文,个人原创,转载请注明出处,有不对的地方欢迎指出与交流. 英文原文:Professional C# 6 and .NET Core 1.0 - 37 ADO.NET --------------- ...
随机推荐
- HDU 3006 The Number of set(位运算 状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3006 题目大意:给定n个集合,每个集合都是由大于等于1小于等于m的数字组成,m最大为14.由给出的集合 ...
- PHP 内存不足
今天编写数据库备份类时,在运行的过程中,出现了内存不足的问题,提示:Fatal error: Allowed memory size of 25165824 bytes exhausted (trie ...
- Photon引擎开发实战(1)——Photon 简介
Photon简介 Photon是一套使用广泛的socket server引擎,服务端底层C++编写,客户端C#编写,跨多平台,收费,效率可观的一款引擎.实用上前有九城游戏(原魔兽世界代理),现在笔者发 ...
- 正则版----getByClass函数
function getByClass(oParent,sClass){ var arr = []; var aEle = oParent.getElementsByTagName('*'); //v ...
- php ob_ 开头的相关函数
<?phpbool ob_start([ callback $output_callback [, int $chunk_size [, bool $erase ]]]); /* 打开输出控制缓 ...
- JavaScript学习总结【4】、JS深入
1.JS流程控制语句 (1).if 判断 if 语句是基于条件成立时才执行相应的代码. if...else 语句是在指定的条件成立时执行if后的代码,在条件不成立时执行else后的代码. if...e ...
- 2016022611 - redis订阅发布命令集合
redis消息订阅发布命令 参考地址:http://www.yiibai.com/redis/redis_pub_sub.html 消息发送者发送消息,通过redis的channal,消息接收者获取消 ...
- Java客户端协议处理框架简介
无论FTP客户程序,还是HTTP客户程序,或是其他基于特定应用层协议的客户程序,在与远程服务器通信时,都需要建立与远程服务器的连接,然后发送和接收与协议相符的数据.客户程序还需要对服务器发送的数据进行 ...
- 《深入剖析Tomcat》阅读(一)
第一章 一个简单的Web服务器 该应用程序仅接受位于指定目录的静态资源的请求,如HTML文件和图像文件.它也可以将传入的HTTP请求字节流显示到控制台上.但是,它并不发送任何头信息到浏览器,如日期或者 ...
- jq总结
总述 jQuery 框架提供了很多方法,但大致上可以分为3 大类: 获取jQuery 对象的方法 在jQuery 对象间跳转的方法 获取jQuery 对象后调用的方法 获取 jQuery 对象 是怎样 ...