一 致 的 数 据 访 问 技 术ADO/OLE DB ( 一)
潘 爱 民
---- 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 对 象 仍 然 使 用 其 内 部 的 数 据 源 连 接。( 未 完 待 续)
---- ( 作 者 地 址: 北 京 大 学 计 算 机 科 学 技 术 研 究 所,100871, 收 稿 日 期:1999.02)
---- 责 任 编 辑: 许 菊 芳 xu_jufang@ccw.com.cn
-