[返回]
微电脑世界1999年第10期
潘爱民
Microsoft 新近推出的UDA(Universal
Data Access,一致数据访问技术)
为关系型或非关系型数据访问提供了一致的访问接口,为企业级Intranet
应用多层软件结构提供了数据接口标准。一致数据访问包括两层软件接口,分别为ADO(Active
Data Object) 和OLE DB,对应于不同层次的应用开发,ADO
提供了高层软件接口,可在各种脚本语言(Script)
或一些宏语言中直接使用;OLE DB 提供了底层软件接口,可在C/C++
语言中直接使用。ADO 以OLE DB 为基础,它对OLE DB
进行了封装。一致数据访问技术建立在Microsoft 的COM( 组件对象模型)
基础上,它包括一组COM
组件程序,组件与组件之间或者组件与客户程序之间通过标准的COM
接口进行通讯。
由于ADO 建立在自动化(Automation) 基础上,所以ADO
的应用场合非常广泛,不仅可在Visual Basic
这样的高级语言开发环境中使用,还可以在一些脚本语言中使用,这对于开发Web
应用,在ASP(Active Server Page)
的脚本代码访问数据库中提供了操作应用的捷径。本文将首先介绍ADO
和OLE DB 的结构模型,以便读者了解ADO 与OLE DB 之间的关系,然后介绍ADO
的对象模型和ADO
的一些特性,同时我们也将通过一些例子代码向读者展示ADO
的用法。
一、一致数据访问介绍
随着网络技术和数据库技术的不断发展,现在的应用系统对数据集成的要求越来越高,这些数据有可能分布在不同的地方,并且使用不同的格式,例如关系型数据库和操作系统中的文件、电子表格、电子邮件、多媒体数据以及目录服务信息等等。传统的解决方案是使用大型的数据库系统,把所有这些数据都移到数据库系统中,然后按照操作数据库的办法对这些数据进行访问,这样做虽然能够按统一的方式对数据进行各种操作,但这种间接访问方式带来了很多问题,比如数据更新不及时、空间资源的冗余和访问效率低等等。
Microsoft
公司推出的一致数据访问技术则较好地解决了这些问题,它使得应用通过一致的接口来访问各种各样的数据,而不管数据驻留在何处,也不需要进行数据转移或复制、转换,在实现分布式的同时也带来了高效率。并且UDA
技术在统一数据访问接口的同时,它的多层结构使数据使用方有了更多的选择机会,而它强大的扩展能力也给数据提供方留下了更多的扩展余地,这种开放型的软件结构使它具有极强的生命力,所以,这种技术从一推出便获得了广泛的欢迎,可以说,UDA
技术是继ODBC 之后的又一数据访问技术的飞跃。
UDA 技术包括OLE DB 和ADO 两层标准接口,OLE DB
是系统级的编程接口,它定义了一组COM
接口,这组接口封装了各种数据系统的访问操作,这组接口为数据使用方和数据提供方建立了标准,OLE
DB
还提供了一组标准的服务组件,用于提供查询、缓存、数据更新、事务处理等操作,因此,数据提供方只需实现一些简单的数据操作,在使用方就可以获得全部的数据控制能力。
ADO 是应用层的编程接口,它通过OLE DB 提供的COM
接口访问数据,它适合于各种客户机/ 服务器应用系统和基于Web
的应用,尤其在一些脚本语言中访问数据库操作是ADO 的主要优势。ADO
是一套用自动化技术建立起来的对象层次结构,它比其他的一些对象模型如DAO(Data
Access Object)、RDO(Remote Data Object)
等具有更好的灵活性,使用更为方便,并且访问数据的效率更高。
图1 显示了统一数据访问的软件层次模型。

图1 UDA 的层次结构图
从图中我们可以看出,应用程序既可以通过ADO
访问数据也可以直接通过OLE DB 访问数据,而ADO 则通过OLE DB
访问底层数据。而且,OLE DB
分成两部分,一部分由数据提供者实现,包括一些基本功能,如获取数据、修改数据、添加数据项等;另一部分由系统提供,包括一些高级服务,如游标功能、分布式查询等等。这样的层次结构既为数据使用者即应用程序提供了多种选择方案,又为数据提供方简化了服务功能的实现手段,它只需按OLE
DB 规范编写一个COM
组件程序即可,使得第三方发布数据更为简便,而在应用程序方可以得到全面的功能服务,这充分体现了OLE
DB 两层结构的优势。
由于OLE DB 和ADO 都以COM 组件的形式实现,所以COM
组件的各种特性也使得构建数据应用更为灵活,而不仅仅局限于一般的客户机/
服务器或Web
应用模型,它既适合于以数据为中心的应用,也适合于多层结构的分布式软件系统。通过对COM
组件的配置,我们可以建立各种复杂的应用系统。利用从COM 到DCOM
的位置透明技术,我们可以很方便地建立分布式应用系统;利用MTS(Microsoft
Transaction Server)
运行环境,我们也可以在数据访问一层增加安全性控制,并利用MTS
的对象管理使数据访问效率更高。所有这些功能都无需数据提供方编写代码实现,只需在DCOM
或MTS 环境中进行常规的配置即可。
可以说一致的数据访问技术的核心是OLE DB,OLE DB
建立了数据访问的标准接口,它把所有的数据源经过抽象形成行集(rowset)
的概念。OLE DB 模型主要包括以下一些COM 对象:
(1) 数据源(Data Source)
对象数据源对象对应于一个数据提供者,它负责管理用户权限、建立与数据源的连接等初始操作。
(2) 会话(Session)
对象在数据源连接的基础上建立会话对象,会话对象提供了事务控制机制。
(3) 命令(Command)
对象数据使用者利用命令对象执行各种数据操作,如查询命令、修改命令等。
(4) 行集(Rowset)
对象提供了数据的抽象表示,它可以是命令执行的结果,也可以直接由会话对象产生,它是应用程序主要的操作对象。
OLE DB
的对象模型非常简单,这种简单性也带来了灵活性,从上面的几个COM
对象也可以看出这一点。下面我们将从应用层角度出发,通过建立在OLE
DB 基础上的ADO
对象模型结构的分析和使用以帮助读者进一步理解一致数据访问技术。
二、ADO 对象模型
ADO 对象模型定义了一组可编程的自动化对象,可用于Visual Basic、Visual
C++、Java 以及其他各种支持自动化特性的脚本语言。ADO 最早被用于Microsoft
Internet Information Server
中访问数据库的接口,与一般的数据库接口相比,ADO
可更好地用于网络环境,通过优化技术,它尽可能地降低网络流量;ADO
的另一个特性是使用简单,不仅因为它是一个面向高级用户的数据库接口,更因为它使用了一组简化的接口用以处理各种数据源。这两个特性使得ADO
必将取代RDO 和DAO,成为最终的应用层数据接口标准。
从图1 我们也看到了ADO 实际上是OLE DB
的应用层接口,这种结构也为一致的数据访问接口提供了很好的扩展性,而不再局限于特定的数据源,因此,ADO
可以处理各种OLE DB 支持的数据源。
图2 是ADO 的对象模型图。

图2 ADO 对象模型
在ADO 模型中,主体对象只有3 个:Connection、Command 和Recordset,其他4
个集合对象Errors、Properties、Parameters 和Fields 分别对应Error、Property、Parameter
和Field 对象,整个ADO 对象模型由这些对象组成。
一个典型的ADO 应用使用Connection
对象建立与数据源的连接,然后用一个Command
对象给出对数据库操作的命令,比如查询或者更新数据等,而Recordset
用于对结果集数据进行维护或者浏览等操作。Command
命令所使用的命令语言与底层所对应的OLE DB
数据源有关,不同的数据源可以使用不同的命令语言,对于关系型数据库,通常使用SQL
作为命令语言。
在Connection、Command 和Recordset 3 个对象中,Command
对象是个可选对象,它是否有效取决于OLE DB 数据提供者是否实现了ICommand
接口。由于OLE DB
可提供关系型数据源也可以提供非关系型数据源,所以在非关系型数据源上使用传统的SQL
命令查询数据有可能无效,甚至Command 命令对象也不能使用。
从结构上看,ADO
模型非常简单,但使用上又非常灵活,下面我们先从单个对象的角度进行讨论:
(1) Connection 对象Connection 对象代表与数据源之间的一个连接,ADO
的Connection 对象封装了OLE DB 的数据源对象和会话对象。根据OLE DB
提供者的不同性能,Connection 对象的特性也有所不同,所以Connection
对象的方法和属性不一定都可以使用。利用Connection
对象,我们可以完成以下一些基本设置操作。
a. 通过ConnectionString、ConnectionTimeOut 和Mode
属性设置连接串、超时信息、访问模式。
b. 还可以设置CursorLocation
属性以便指定使用客户端游标,以便在客户程序中使用批处理修改方式。
c. 设置连接的缺省数据库属性DefaultDatabase。
d. 设置OLE DB 提供者的属性Provider。
e. 通过Open 和Close 控制Connection 对象与物理数据源的连接。
f. 通过Execute 方法执行命令。
g. 提供事务机制,通过BeginTrans、CommitTrans 和RollbackTrans
方法实现事务控制。
h. 通过Errors 集合属性检查数据源的错误信息。
i. 通过OpenSchema 方法获取数据库的表信息。
Connection 对象是ADO
的基本对象之一,它独立于所有其他的对象。如果我们要对数据库进行查询操作,既可以使用Execute
方法,也可以使用Command 对象。使用Execute 方法比较简便,但用Command
对象可以保存命令的信息,以便多次查询。
(2) Command 对象Command
对象代表一个命令,可以通过其方法执行针对数据源的有关操作,比如查询、修改等。Command
对象的用法如下:
a. 通过CommandText 属性设置命令串。
b. 通过Parameters 集合属性和Parameter
对象定义参数化查询或存储过程的参数。
c. 通过Execute 方法执行命令,可能的话,返回Recordset 对象。
d. 在执行命令之前,可通过设置CommandType 属性以便优化性能。
e. 可以通过Prepared
属性指示底层的提供者为当前命令准备一个编译过的版本,以后再执行时,速度会大大加快。
f. 通过CommandTimeOut 属性设置命令执行的超时值( 以秒为单位)。
g. 可以设置ActiveConnection 属性,为命令指定连接串,Command
对象将在内部创建Connection 对象。
h. 可以设置Name 属性,这样以后可以在相应的Connection 对象上按Name
属性指定的方法名执行。
Command 对象执行时,既可以通过ActiveConnection 属性指定相连的Connection
对象,也可以独立于Connection 对象,直接指定连接串,即使连接串与Connection
对象的连接串相同,Command
对象仍然使用其内部的数据源连接。(未完待续)