4-1-1 ADO.NET 的优点及主要对象

1. ADO.NET优点

ADO.NET具有互操作性、可维护性、可编程性、性能优化、可伸缩性等优点。与ADO的早期版本和其他数据访问组件相比,ADO.NET提供了若干好处。这些好处分成以下几个类别:
1)互操作性
ADO.NET应用程序可以利用XML的灵活性和广泛接受性。由于XML是用于在网络中传输数据集的格式,因此可以读取XML格式的任何组件都可以处理数据。实际上,接收组件根本不必是ADO.NET组件:传输组件可以只是将数据集传输给其目标,而不考虑接收组件的实现方式。目标组件可以是Visual Studio应用程序或无论用什么工具实现的其他任何应用程序。唯一的要求是接收组件能够读取XML。作为一项工业标准,XML正是在谨记这种互操作性的情况下设计的。
2)可维护性
在已部署系统的生存期中,适度的更改是可能的,但由于十分困难,所以很少尝试进行实质的结构更改。这是很遗憾的,因为在事件的自然过程中,这种实质上的更改会变得很有必要。例如,当已部署的应用程序越来越受用户欢迎时,增加的性能负荷可能需要进行结构更改。随着已部署的应用程序服务器上的性能负荷的增长,系统资源会变得不足,并且响应时间或吞吐量会受到影响。面对该问题,软件设计者可以选择将服务器的业务逻辑处理和用户界面处理划分到单独计算机上的单独层上。实际上,应用程序服务器层将替换为两层,这就缓解了系统资源的缺乏。
该问题并不是要设计三层应用程序。相反,它是要在应用程序部署以后增加层数。如果原始应用程序使用数据集以ADO.NET方式实现,则该转换很容易进行。请记住,当用两层替换单个层时,将安排这两层交换信息。由于这些层可以通过XML格式的数据集传输数据,所以通信相对较容易。
3)可编程性
Visual Studio中的ADO.NET数据组件以不同方式封装数据访问功能,帮助您加快编程速度并减少犯错几率。例如,数据命令提取生成,执行SQL语句或存储过程的任务等。
4)性能优化
对于不连接的应用程序,ADO.NET数据库提供的性能优于ADO不连接的记录集。当使用COM封送在层间传输不连接的记录集时,会因将记录集内的值转换为COM可识别的数据类型而导致显著的处理开销。在ADO.NET中,这种数据类型转换则没有必要。
5)可伸缩性
因为Web可以极大增加对数据的需求,所以可缩放性变得很关键。Internet应用程序具有无限的潜在用户供应。尽管应用程序可以很好地为十几个用户服务,但它可能不能向成百上千个(或成千上万个)用户提供同样好的服务。使用数据库锁和数据库连接之类资源的应用程序不能很好地为大量用户服务,因为用户对这些有限资源的需求最终将超出其供应。
ADO.NET通过鼓励程序员节省有限资源来实现可缩放性。由于所有ADO.NET应用程序都使用对数据的不连接访问,因此它不会在较长持续时间内保留数据库锁或活动数据库连接。

2.        ADO.NET对象

ADO.NET 对象模型中有五个主要的组件,分别是Connection对象、Command对象、DataAdapter对象、DataSet对象以及DataReader对象。这些组件中负责建立联机和数据操作的部分我们称为数据操作组件(Managed Providers ,分别由Connection 对象、Command 对象、DataAdapter对象以及DataReader 对象所组成。数据操作组件最主要是当作DataSet 对象以及数据源之间的桥梁,负责将数据源中的数据取出后植入DataSet 对象中,以及将数据存回数据源的工作。下分别对ADO.NET的五大基本对象模型进行说明:
1Connection对象
Connection 对象主要是开启程序和数据库之间的连结。没有利用连结对象将数据库打开,是无法从数据库中取得数据的。这个物件在ADO.NET的最底层,我们可以自己产生这个对象,或是由其它的对象自动产生。
2Command对象
Command对象主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及呼叫存在数据库中的预存程序等。这个对象是架构在Connection对象上,也就是Command对象是通过连结到数据源。
3DataAdapter对象
DataAdapter对象主要是在数据源以及DataSet之间执行数据传输的工作,它可以通过Command对象下达命令后,并将取得的数据放入DataSet对象中。这个对象是架构在Command对象上,并提供了许多配合DataSet使用的功能。
4DataSet对象
DataSet这个对象可以视为一个暂存区(Cache),可以把从数据库中所查询到的数据保留起来,甚至可以将整个数据库显示出来。DataSet的能力不只是可以储存多个Table而已,还可以通过DataAdapter对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。DataSet对象可以说是ADO.NET中重量级的对象,这个对象架构在DataAdapter对象上,本身不具备和数据源沟通的能力;也就是说我们是将DataAdapter对象当做DataSet 对象以及数据源间传输数据的桥梁。
5DataReader对象
当我们只需要循序的读取数据而不需要其它操作时,可以使用DataReader对象。DataReader对象只是一次一笔向下循序的读取数据源中的数据,而且这些数据是只读的,并不允许作其它的操作。因为DataReader在读取数据的时候限制了每次只读取一笔,而且只能只读,所以使用起来不但节省资源而且效率很好。使用DataReader对象除了效率较好之外,因为不用把数据全部传回,故可以降低网络的负载。

4-1-2  ADO.NET的结构

4-5  ADO.NET的承上启下作用图
ADO.NET如何承接客户端的数据请求,又如何完成数据源的访问?可以通过图45 来说明。这里提到的数据源是个更大的概念,数据库是数据源中的一种,Excel文件也可能是数据源。
ADO.NET通过Connection对象与数据源相连接,完成架设线路的作用。CommandDataAdapter对象利用这个Connection对象发送命令信号给数据源,这个命令信号可能是SQL语句,也可能是存储过程的名字,由数据源执行完成。如果命令信号要求返回数据,客户端就可以利用DataReader或者DataSet对象访问得到的数据。如果命令信号是其他操作,客户端就可以直接通过Command甚至Connection对象完成操作。
前面提到ADO.NET中的几个对象。那么完整的ADO.NET数据对象模型应该是什么样的呢?我们通过图46来详细了解。
4-6  ADO.NET数据对象模型图
整个对象模型分为两大部分。第一部分是.NET Framework数据提供程序部分,第二部分是作为客户端本地缓存的数据集部分。
.NET Framework数据提供程序部分包括的对象有Connection对象,Connection对象又可以产生事务对象——Command对象,与Command对象伴生的参数对象,DataReader对象,DataAdapter对象,与DataAdapter对象伴生的SelectCommandInsertCommandUpdateCommandDeleteCommand对象。数据提供程序部分负责建立连接、发布命令、传输数据等功能。
本地缓存数据集部分包括DataSet对象,DataSet对象在本地相当于一个小型数据库,因此DataSet对象由数据表及表关系组成,所以DataSet对象包含DataTable对象和DataRelation对象,而数据表又包含行和列以及约束等结构,所以DataTable对象包含DataRowDataColumnConstraint对象。本地缓存数据集部分可以用来临时存储本地数据,这些数据可以是从数据库获取的,也可以是本地产生的,还可以是被修改的数据。在借助DataRelationConstraint对象情况下,客户端可以像访问关系型数据那样访问本地缓存数据集。
ADO.NET中应用XML支持DataSet对象,这是由于XML主要关注的是关系和分层的结构化数据。DataSet的内容可以以XML文档的形式写出,也可以将XML文档的内容读入到DataSet中。