本地数据访问的解决方案
问题 用户需要简单、统一的应用程序编程接口 (API),使应用程序能够访问和修改各种各样的数据源。数据源可能象文本文件一样简单,也可能象一组异构数据库那样复杂,或者是尚未定型的某种数据源。此外,API 不应该预先设定访问和操作数据源的方式。
虽然提出了这些特定要求,典型的数据源依然是支持开放式数据库互连 (ODBC) 标准的关系数据库,可以通过用结构化查询语言 (SQL) 编写的命令对它进行操作。
Microsoft 对此问题提供的总体解决方案是 OLE DB,这是一套组件对象模型 (COM) 接口,可提供对存储在不同信息源中的数据进行统一访问的能力。但是,由于 OLE DB 应用程序编程接口的设计目的是为各种应用程序提供优化的功能,因此它无法满足对简单化的要求。
您需要的 API 应该是一座连接应用程序和 OLE DB 的桥梁。这就是 ActiveX Data Objects (ADO)。
解决方案 ADO 定义了“编程模型”,即访问和更新数据源所必需的一系列活动。编程模型概括了 ADO 的完整功能。
编程模型提出“对象模型”(即“对象”集)来表达和实现编程模型。对象具有“方法”和“属性”,方法用于操作数据,属性用于表示数据属性或控制某些对象方法的行为。
与对象关联的是“事件”,事件用于通知某些操作已经发生或即将发生。
基本 ADO 编程模型
ADO 提供执行以下操作的方法:
连接数据源。可以确保对数据源的更改全部成功或全部失败。
指定访问数据源的命令,可选择带变量参数或优化执行。
执行命令。
如果命令导致数据按表中行的格式返回,则将这些行存储在易于检查、操作和更改的缓存中。
适当情况下,可使用缓存行中的更改内容来更新数据源。
提供检测错误(通常由建立连接或执行命令造成)的常规方法。 通常情况下,需要在编程模型中采用所有这些步骤。但是,因为 ADO 具有很强的灵活性,所以只需要执行模型的一部分就能完成有用的工作。例如,可以将数据直接从文件存储到缓存行中,然后仅用 ADO 资源对数据进行检查。
ADO 编程模型详细信息
下面是 ADO 编程模型的关键元素:
连接
命令
参数
记录集
字段
错误
属性
记录
流
集合
事件 连接
通过“连接”可从应用程序访问数据源,连接是交换数据所必需的环境。通过如 Microsoft Internet Information Services (IIS) 等媒介,应用程序可直接(有时称为双层系统)或间接(有时称为三层系统)访问数据源。
对象模型用 Connection 对象来体现连接的概念。
“事务”用于分隔在连接过程中发生的一系列数据访问操作的开始和结束。ADO 确保由事务中的操作造成的对数据源的更改全部成功或者全部失败。
如果事务被取消或它的一个操作失败,最终的结果是事务中的操作都不会发生。数据源将保持事务开始前的状态。
对象模型没有明确体现出事务的概念,而是用一组 Connection 对象方法来表示。
ADO 访问来自 OLE DB 提供者的数据和服务。Connection 对象用于指定特定提供者和任意参数。例如,可通过 Microsoft OLE DB Remoting Provider 显式或隐式调用远程数据服务 (RDS)。(有关通过 OLE DB Remoting Provider 调用 RDS 的范例,请参阅 RDS 教程的步骤 2。)
作为连接目标的数据源可以通过连接字符串或统一资源定位符 (URL) 来指定。
命令
“命令”通过已建立的连接发出,它能以某种方式操作数据源。命令通常可以在数据源中添加、删除或更新数据,或者以表中行的格式检索数据。
对象模型用 Command 对象来体现命令的概念。Command 对象使 ADO 能够优化执行命令。
参数
通常,命令需要的变量部分(即“参数”)可以在命令发出之前进行更改。例如,可重复发出相同的数据检索命令,每一次都指定检索不同的信息。
参数对执行其行为类似函数的命令尤其有用。在这种情况下,只需知道命令是做什么的,而不必知道它如何工作。例如,发出一项银行过户命令,从一方借出贷给另一方。这时可将要过户的款额指定为参数。
对象模型用 Parameter 对象来体现参数的概念。
记录集
如果命令是按表中的信息行返回数据的查询(即行返回查询),这些行将存储在本地。
对象模型用 Recordset 对象来体现存储。
Recordset 是在行中检查和修改数据的主要方法。Recordset 对象用于:
指定可以检查的行。
遍历行。
指定遍历行的顺序。
添加、更改或删除行。
用更改的行更新数据源。
管理 Recordset 的总体状态。 字段
Recordset 的一行由一个或多个“字段”组成。如果把 Recordset 看作二维网格,排成行的字段将构成“列”。每一字段(列)都分别具有名称、数据类型和值等属性。正是在这个值中包含了来自数据源的实际数据。
对象模型用 Field 对象来体现字段。
要修改数据源中的数据,请修改 Recordset 行中 Field 对象的值。最终,对 Recordset 的更改被传播到数据源。作为一种选择,Connection 对象的事务管理方法能够保证更改要么全部成功,要么全部失败。
错误
错误随时会在应用程序中发生,通常是由于无法建立连接、无法执行命令或无法对处于某种状态的对象进行操作(例如,试图使用没有初始化的 Recordset)而引起的。
对象模型用 Error 对象来体现错误。
任何给定的错误都会生成一个或多个 Error 对象。随后发生的错误将放弃先前的 Error 对象集合。
属性
每个 ADO 对象都有一组唯一的“属性”来描述或控制该对象的行为。
有两种类型的属性:内置属性和动态属性。内置属性是 ADO 对象的一部分并且随时可用。动态属性由基本的数据提供者或服务提供者添加到 ADO 对象的 Properties 集合中,并且仅在使用该提供者时才存在。
对象模型用 Property 对象来体现属性。
记录
并非所有的数据源都以数据库表的形式存在。文件和电子邮件系统等信息存储系统由“容器”和“内容”组件组成。容器可以包含内容及其他从属容器。
在文件系统中,容器和内容分别是“目录”和“文件”,而在电子邮件系统中,它们分别是“文件夹”和“邮件”。
对象模型用 Record 对象来体现容器和内容。另外,Recordset 行也可以用 Record 对象来体现。
Record 对象提供执行下列操作的方法:
复制、删除或移动它所表示的项目。
创建适合表示目录、文件或 Recordset 行等项目的新 Record。 Record 对象与 Connection 和 Recordset 等其他 ADO 对象结合使用。但是,Record 对象的设计目的与基本 ADO 编程模型中描述的 ADO 对象不同,它是为了解决其他问题。有关详细信息,请参阅 Record 和 Stream。
流
信息存储系统的“内容”(如文件系统中的“文件”),由字节流组成。“内存”中的缓冲区也是由字节流组成的。
对象模型用 Stream 对象来体现字节流。
Stream 对象提供执行下列操作的方法:
读取或写入一系列字节或文本行。
从文件中自动预置,或持久保留到文件中。 Stream 对象只能与 Record 对象结合使用。Stream 对象的设计目的与基本 ADO 编程模型中描述的 ADO 对象不同,它是为了解决其他问题。有关详细信息,请参阅 Record 和 Stream。
集合
ADO 提供“集合”,它是一种对象,可方便地包含其他特定类型的对象。使用集合属性可按名称(文本字符串)或序号(整数)对集合中的对象进行检索。
ADO 提供四种集合:
Connection 对象具有 Errors 集合,它包含为响应与数据源有关的单个错误而创建的所有 Error 对象。
Command 对象具有 Parameters 集合,它包含应用于该 Command 对象的所有 Parameter 对象。
Recordset 和 Record 对象具有 Fields 集合,它包含定义该 Recordset 对象列的所有 Field 对象。
另外,Connection、Command、Recordset 和 Field 对象都具有 Properties 集合,它包含应用于所属对象的所有 Property 对象。 ADO 对象包含属性,可通过 INTEGER、CHARACTER 或 BOOLEAN 等公用数据类型在其中设置或检索值。然而,有必要将某些属性看作数据类型为“COLLECTION OBJECT”的返回值。相应的,集合对象包含存储和检索适合该集合的其他对象的方法。
例如,可以认为 Recordset 对象具有能够返回集合对象的 Properties 属性。该集合对象包含可以存储和检索描述该 Recordset 属性的 Property 对象的方法。
事件
“事件”是有关某些操作即将发生或已经发生的通知。可以用事件有效地改写包含几个异步任务的应用程序。
对象模型不直接体现事件,而是通过调用事件处理程序例程来表示。
在操作开始之前调用的事件处理程序使用户可以对操作参数进行检查或修改,然后取消操作或允许完成操作。
操作完成之后调用的事件处理程序通知您异步操作已经完成。多个操作已经增强,可以异步执行。例如,启动异步 Recordset.Open 操作的应用程序在操作结束时会接收到执行完成事件的通知。
使用对象的 ADO 编程模型
ADO 的目的是访问、编辑和更新数据源。编程模型体现了实现此目的所必需的一系列活动。ADO 提供完成下列每一项操作所需的类和对象:
建立与数据源的连接 (Connection)。可选,开始一个事务。
可选,创建表示命令(如,SQL 命令)的对象 (Command)。
可选,在 SQL 命令中指定列、表和值作为变量参数 (Parameter)。
执行命令(Command、Connection 或 Recordset)。
如果命令以行返回,则将行存储在缓存中 (Recordset)。
可选,创建缓存视图以便对数据进行排序、过滤和定位 (Recordset)。
通过添加、删除或更改行和列来编辑数据 (Recordset)。
适当情况下,用缓存中的更改内容来更新数据源 (Recordset)。
在使用事务之后,可以接受或拒绝在事务中所做的更改。结束事务 (Connection)。
ADO 对象汇总
| 对象 | 说明 |
| Connection |
启用数据交换。 |
| Command |
体现 SQL 语句。 |
| Parameter |
体现 SQL 语句参数。 |
| Recordset |
启用数据定位和操作。 |
| Field |
体现 Recordset 或 Record 对象的列。 |
| Error |
体现连接错误。 |
| Property |
体现 ADO 对象特性。 |
| Record |
体现目录或文件。 |
| Stream |
体现文件内容。 |
ADO 集合汇总
| 集合 | 说明 |
| Errors |
为响应单个连接失败而创建的所有 Error 对象。 |
| Parameters |
与 Command 对象相关联的所有 Parameter 对象。 |
| Fields |
与 Recordset 对象相关联的所有 Field 对象。 |
| Properties |
与 Connection、Command、Recordset 或 Field 对象相关联的所有 Property 对象。 |
ADO 事件处理程序汇总
| ConnectionEvents | 说明 |
BeginTransComplete、 CommitTransComplete 和 RollbackTransComplete |
事务管理 — 通知连接中的当前事务已开始、提交或回卷。 |
| WillConnect、ConnectComplete 和 Disconnect |
连接管理 — 通知当前连接即将开始、已经开始或已经结束。 |
| WillExecute 和 ExecuteComplete |
命令执行管理 — 通知连接中当前命令的执行即将开始或已经结束。 |
| InfoMessage |
信息 — 通知存在与当前操作相关的附加信息。 |
| RecordsetEvents | 说明 |
| FetchProgress 和 FetchComplete |
检索状态 — 通知数据检索操作的进度或检索操作已经完成。 |
| WillChangeField 和 FieldChangeComplete |
字段更改管理 — 通知当前字段的值将要更改或已经更改。 |
| WillMove、MoveComplete 和 EndOfRecordset |
定位管理 — 通知 Recordset 中的当前行位置将要更改、已经更改或已到达 Recordset 的结尾。 |
| WillChangeRecord 和 RecordChangeComplete |
行更改管理 — 通知 Recordset 当前行中的某些内容将要更改或已经更改。 |
| WillChangeRecordset 和 RecordsetChangeComplete |
记录集更改管理 — 通知当前 Recordset 中的某些内容将要更改或已经更改。 |
|