| 使用Visual Basic 4开发客户机/服务器应用 |
| Visual Basic 4
的 推 出 为 我 们 带 来 了 客 户 机 / 服 务 器 应 用 开 发 的 新 时
代。 它 的 三 个 版 本 提 供 了 不 同 级 别 的 数 据 存 取 功 能。
标 准 版 提 供 了 JET 数 据 库 引 擎 的 功 能 子 集, 你 可 以 通 过
数 据 控 件 和 某 些 绑 定 控 件 存 取 现 有 的 数 据 库, 但 不 能
建 立 新 的 数 据 库, 也 不 能 使 用 数 据 存 取 对 象。 专 业 版
包 含 了 数 据 控 件 的 全 部 功 能, 提 供 了 全 面 的 数 据 库 对
象 编 程 接 口, 你 也 可 以 把 数 据 库 存 取 对 象 和 数 据 控 件
结 合 起 来, 以 得 到 更 大 的 便 利。 企 业 版 则 另 外 增 加 了
大 量 专 门 用 于 主 从 模 式 的 工 具, 包 括 专 门 存 取 远 程
ODBC 数 据 库 的 控 件 和 对 象。 本 文 着 重 讨 论 采 用 Visual Basic
连 接 远 程 ODBC 数 据 库 的 几 种 编 程 模 型 (Programming Model)。 Visual Basic 4 提 供 了 多 种 联 结 至 远 程 数 据 库 的 编 程 模 型, 它 们 是: · 由 Microsoft JET 数 据 库 引 擎 实 现 的 DATA 控 件、 绑 定 控 件 和 数 据 存 取 对 象 · 由 RDO 接 口 实 现 的 RemoteData 控 件, 绑 定 控 件 和 远 程 数 据 对 象 · ODBC API · Microsoft SQL Server 的 Visual Basic 库 (VBSQL) 为 了 方 便 大 家 选 择 合 适 的 模 型 用 VB 进 行 主 从 模 式 应 用 的 开 发, 下 面 介 绍 各 种 编 程 模 型 的 便 利 之 处 及 其 局 限 性。 Microsoft Jet 数 据 库 引 擎数 据 存 取 对 象 (DAO) 是 Visual Basic 和 Access 内 含 的 可 编 程 对 象 集 合。 Database、 TableDef 和 QueryDef 对 象 三 者 组 成 了 DAO。 DAO 使 用 Microsoft JET 数 据 库 引 擎。 这 个 引 擎 在 Access 和 Visual Basic 这 两 个 微 软 产 品 中 都 采 用, 从 本 质 上 来 说 这 两 个 产 品 是 采 用 的 同 一 套 数 据 库 编 程 语 言。 JET 是 在 VB 中 最 常 用 的 存 取 本 地 数 据 的 方 法, 但 是 用 JET 与 远 程 数 据 库 的 联 结 时, 它 也 是 很 方 便 的。 通 过 ODBC 管 理 器 和 专 门 的 数 据 库 服 务 器 驱 动 程 序, DAO 使 用 JET 数 据 库 引 擎 与 远 程 数 据 库 服 务 器 通 讯 (如 下 图 所 示)。 这 个 方 法 把 开 发 者 从 针 对 不 同 数 据 库 服 务 器 进 行 特 殊 编 程 的 纷 乱 中 隔 离 出 来, 在 高 层 次 上 提 供 了 数 据 存 取 对 象、 属 性 和 方 法。 DAO 代 码 → Visual Basic 程 序 ↑ 数 据 存 取 对 象 ↑ JET 数 据 库 引 擎 ↑ ODBC 驱 动 程 序 管 理 器 ↑ ODBC 驱 动 程 序 ↑ 当 使 用 DAO 或 DATA 控 件 和 相 关 的 绑 定 控 件 时, 自 动 引 发 JET 引 擎 的 查 询 处 理 程 序。 JET 引 擎 也 可 通 过 DAO 进 行 编 程 控 制, 由 DATA 控 件 来 处 理。 使 用 DATA 控 件 和 绑 定 控 件 可 以 大 大 节 省 你 的 开 发 时 间。 JET 编 程 模 型 具 有 如 下 特 性 ∶ · 万 用 的 编 程 模 型, JET 可 存 取 任 何 ODBC 数 据 库 · 可 完 全 卷 动 的 结 果 集 合 · 可 更 新 的 查 询 (包 括 join 操 作) · 对 ODBC 或 ISAM 数 据 源 进 行 异 构 join 和 fetch 查 询, 可 跨 越 多 种 数 据 库 操 作 · 面 向 对 象 的 编 程 模 型, 不 需 要 使 用 API · 具 有 直 通 (pa 用 API · 具 有 直 通 (pass-through) 机 制, 可 跳 过 JET 查 询 处 理 程 序 直 接 进 入 服 务 器 · 对 Keyset(动 态 集), static(快 照) 和 只 往 前 卷 动 的 快 照 游 标 的 处 理 · 对 结 果 集 合 的 高 级 管 理 · 可 利 用 大 多 数 SQL Server 特 性 · 通 用 的 错 误 管 理 很 难 将 JET 与 VBSQL 或 ODBC 进 行 直 接 和 简 单 的 比 较, 因 为 JET 具 有 许 多 特 性。 对 JET 编 程 比 VBSQL 和 ODBC 要 简 单 得 多, 并 且 通 常 代 码 量 也 少 得 多。 但 是, 伴 随 使 用 JET 的 代 价 是: · 为 得 到 最 佳 性 能, 在 多 数 情 况 下 需 要 进 行 细 心 的 调 整 和 优 化 · 无 法 实 现 特 定 服 务 器 专 有 的 功 能 (例 如 复 杂 的 存 储 过 程) · 比 其 它 方 法 占 用 更 多 的 内 存 和 时 间 因 此, 如 果 开 发 者 没 有 多 少 数 据 库 的 经 验, 想 利 用 交 互 式 浏 览 工 具 进 行 快 速 的 开 发, JET 是 比 较 合 适 的。 远 程 数 据 对 象 (RDO) 和 远 程 数 据 控 件这 是 Visual Basic4 企 业 版 特 有 的 新 功 能。 通 过 使 用 RDO 和 RemoteData 控 件, 应 用 程 序 无 需 通 过 本 地 的 查 询 处 理 程 序 就 可 直 接 与 远 程 ODBC 数 据 源 打 交 道, 从 而 意 味 着 性 能 上 的 极 大 提 高 和 更 好 的 适 应 性, 使 用 远 程 数 据 对 象, 可 通 过 与 数 据 库 无 关 的 面 向 对 象 的 代 码 提 交 查 询, 建 立 结 果 集 合 和 处 理 查 询 结 果。 Remote-Data 控 件 与 Data 控 件 相 似, 除 了 它 建 立 和 处 理 它 自 己 的 对 象 集 合, 称 为 远 程 数 据 对 象。 RemoteData 控 件 与 Data 控 件 一 样 有 能 力 控 制 对 数 据 敏 感 的 控 件 (即 绑 定 控 件), 它 们 的 编 程 接 口 也 相 似。 如 果 你 想 把 控 件 绑 定 到 外 部 ODBC 数 据 源, 并 且 你 没 有 存 取 本 地 的 JET 数 据 库 和 JET 支 持 的 任 何 一 种 ISAM 数 据 库, 那 么 使 用 RemoteData 控 件 和 与 之 相 关 的 对 象 是 最 佳 的 选 择。 下 图 表 示 有 RDO 代 码 和 RemoteData 控 件 的 Visual Ba-sic 程 序 如 何 通 过 RDO 与 远 程 数 据 库 服 务 器 通 讯, RDO 直 接 与 ODBC 驱 动 程 序 管 理 器 和 专 门 的 驱 动 程 序 通 讯。 RDO 代 码 → Visual Basic 程 序 ↑ 远 程 数 据 对 象 ↑ ODBC 驱 动 程 序 管 理 器 ↑ ODBC 驱 动 程 序 ↑ RDO 编 程 模 型 提 供 以 下 特 性 ∶ · 万 用 的 编 程 接 口, RDO 适 用 于 存 取 任 何 ODBC 数 据 源 · 面 向 对 象 的 编 程 模 型, 不 需 使 用 API · 把 ODBC 的 环 境、 连 接 和 语 句 句 柄 具 体 化 为 属 性, 直 接 调 用 ODBC API · 对 键 集、 静 态、 动 态 和 只 能 往 前 卷 动 的 游 标 的 处 理 · 支 持 异 步 查 询 · 对 查 询 结 果 集 合 的 高 级 管 理, 包 括 限 制 返 回 行 的 数 目, 同 时 处 理 多 重 查 询 结 果 集 合, 从 存 储 过 程 返 回 值 的 能 力 · 专 门 针 对 Microsoft SQL Server 和 Oracle 远 程 数 据 库 引 擎 进 行 了 优 化, 可 存 取 SQL Server 和 Oracle 远 程 数 据 库 引 擎 的 所 有 功 能, 包 括 服 务 器 端 的 游 标 ODBC APIODBC API 是 对 ODBC 库 和 驱 动 程 序 的 调 用 接 口, 它 提 供 对 Microsoft SQL Server 和 任 何 其 它 有 ODBC 驱 动 程 序 的 数 据 库 (如 IBM DB2、 Oracle、 Sybase、 Dec RDB、 Apple DAL 等) 的 联 结。 通 过 对 这 个 接 口 的 编 程, 你 可 建 立 与 数 据 库 无 关 的 代 码, 也 就 是 说 ODBC API 提 供 通 用 的 编 程 接 口, 可 自 动 与 各 种 数 据 库 接 口, 在 单 个 应 用 中 就 可 存 取 多 种 数 据 库 的 数 据。 ODBC API 提 供 全 面 的 错 误 和 消 息 处 理 能 力, 并 允 许 你 利 用 后 台 数 据 库 的 大 多 数 特 性。 ODBC API 不 支 持 对 数 据 敏 感 的 绑 定 控 件, 但 它 支 持 它 自 己 的 结 果 集 合, 可 利 用 客 户 端 或 服 务 器 端 的 游 标。 根 据 驱 动 程 序 的 级 别 和 远 程 数 据 库 服 务 器 的 能 力, 建 立 和 处 理 游 标 和 其 它 操 作 的 责 任 或 者 由 客 户 端 的 ODBC 驱 动 程 序 完 成, 或 者 委 托 服 务 器 自 己 的 引 擎 来 完 成。 ODBC API 编 程 模 型 具 有 如 下 特 性 ∶ · 万 用 的 编 程 模 型, 可 存 取 许 多 数 据 库 结 构 · 能 够 紧 密 地 控 制 资 源 · 具 有 内 置 的 Microsoft SQL Server 接 口 · API 调 用 比 VBSQL 的 少 · 智 能 化 处 理 存 储 过 程 参 数 · 支 持 Microsoft SQL Server 6.0 服 务 器 端 的 游 标 · 对 键 集、 动 态、 静 态 和 只 能 往 前 滚 动 游 标 的 处 理 · 对 结 果 集 合 的 高 级 管 理 · 完 全 的 Post-Call 错 误 管 理 下 图 表 示 Visual Basic 如 何 执 行 ODBC API 调 用, 它 直 接 进 入 ODBC 驱 动 程 序 管 理 器 的 库 函 数。 这 些 库 函 数 又 连 接 到 ODBC 驱 动 程 序, 驱 动 程 序 允 许 存 取 某 种 远 程 数 据 库, 并 进 行 低 层 数 据 存 取 操 作。 通 常, 在 存 取 不 同 数 据 库 时, 不 用 重 写 应 用 程 序。 你 需 要 做 的 只 是 改 变 远 程 数 据 库 驱 动 程 序。 ODBC API 代 码 → Visual Basic 程 序 ↑ ODBC 驱 动 程 序 管 理 器 ↑ ODBC 驱 动 程 序 ↑ ODBC API 也 是 JET 数 据 库 引 擎 用 来 存 取 外 部 非 ISAM 数 据 库 的 接 口。 JET 对 ISAM 数 据 库 使 用 自 己 的 可 安 装 ISAM(IISAM) 驱 动 程 序, 而 不 用 ISAM ODBC 驱 动 程 序, 当 你 想 通 过 API 来 开 发 一 个 新 的 主 从 模 式 应 用 时, 建 议 采 用 ODBC API。 随 着 数 据 存 取 引 擎 的 发 展, 越 来 越 多 的 数 据 库 开 始 把 ODBC API 作 为 内 含 的 数 据 库 接 口。 比 如, Microsoft SQLerver 6.0 内 含 对 ODBC API 的 支 持。 它 是 跨 平 台 工 具, 在 不 同 平 台 上 具 有 同 样 的 界 面 和 存 取 方 法, ODBC API 使 应 用 软 件 与 底 层 的 网 络 和 DBMS 版 本 隔 离。 这 意 味 着 今 后 在 网 络 传 输、 服 务 器 和 DBMS 方 面 的 变 动 不 会 影 响 现 在 的 ODBC 应 用 软 件 的 执 行。 ODBC API 还 促 进 了 DBMS 标 准 语 言 --SQL 的 使 用 (ANSI 1989 标 准)。 如 今 有 大 量 ODBC 驱 动 程 序 和 支 持 这 些 驱 动 程 序 的 工 具 面 世。 早 期 采 用 ODBC 驱 动 程 序 的 工 具 比 针 对 特 定 数 据 库 服 务 器 的 API 速 度 慢, 比 如 在 存 取 Microsoft SQL Serv-er 数 据 库 时, 它 曾 经 不 如 DB-Library 和 VBSQL 快。 但 是 如 今 的 ODBC 驱 动 程 序 已 经 在 许 多 方 面 极 大 地 改 进 了 性 能, VBSQL 和 ODBC 驱 动 程 序 之 间 的 速 度 差 异 已 经 可 以 忽 略 不 计。 当 然, ODBC API 也 有 一 些 不 足 之 处, 如 它 的 编 程 可 能 复 杂, 特 定 服 务 器 的 某 些 功 能 可 能 不 支 持, 并 且 比 纯 VBSQL 编 程 占 用 更 多 的 内 存。 从 服 务 器 检 索 数 据 的 步 骤 如 下 ∶ 1 · 初 始 化 ODBC 2 · 打 开 与 服 务 器 的 连 接 3 · 建 立 和 发 送 合 适 的 SQL 语 句 4 · 检 索 数 据 5 · 关 闭 连 接 SQL SERVER 的 VISUAL BASIC 库 (VBSQL)DB-Library 是 Microsoft SQL Server 提 供 的 低 层 API, 用 来 支 持 客 户 机 的 开 发 者。 SQLerver 的 Visual Basic 库 (VBSQL) 是 专 门 为 Visual Basic 和 Microsoft SQL Server 优 化 了 的 DB-Library API。 VBSQL 包 含 了 所 有 DB-Library API, 通 过 SQL Server 内 部 接 口 支 持。 人 们 在 多 数 情 况 下 是 用 C 语 言 编 写 DB-Library 程 序, 但 VBSQL 定 制 控 件 (VBX) 使 Visual Basic 编 程 员 获 得 DB-Library 的 几 乎 所 有 功 能, 除 了 没 有 数 据 绑 定 以 及 两 段 式 提 交 能 力。 另 外, VBSQL 可 同 时 处 理 几 个 调 用。 比 如, VBSQL 的 SQLOpenConnection 函 数 对 应 数 个 DB-Library 调 用。 你 也 许 会 问 为 什 么 提 供 VBX。 也 许 只 需 用 一 个 合 适 的 头 文 件 定 义 几 个 入 口 点 就 足 够 了。 使 用 动 态 连 接 库 (DLL) 的 问 题 是, VB 用 户 无 法 通 过 它 们 以 异 步 方 式 执 行 代 码。 而 VBX 有 这 个 功 能。 例 如, 通 过 使 用 VBX, 底 层 的 DB-Library 代 码 能 够 触 发 事 件 (C 程 序 员 通 过 注 册 一 个 回 调 来 触 发)。 在 代 码 执 行 过 程 中, SQL Server 遇 到 的 消 息 和 错 误 都 作 为 事 件 产 生。 这 样, VB 代 码 便 可 取 消 在 服 务 器 的 查 询 或 者 执 行 查 询, 而 同 时 客 户 机 代 码 继 续 执 行。 这 里 需 要 注 意 ∶ 如 果 你 正 在 建 立 一 个 全 新 的 主 从 应 用, 并 且 准 备 使 用 API 编 程, 那 么 建 议 你 VBSQL 和 ODBC API 有 些 地 方 相 似, 它 们 都 提 供 了 最 大 的 适 应 性, 并 且 在 存 取 SQL Server 时 速 度 都 比 其 它 数 据 库 快。 VBSQL 也 不 支 持 绑 定 控 件, 应 用 程 序 开 发 者 必 须 书 写 代 码 以 维 护 和 刷 新 基 于 窗 体 的 控 件。 VBSQL API 编 程 模 型 具 有 如 下 特 性 ∶ · 可 存 取 SQL Server 的 所 有 特 性 · 只 能 存 取 Microsoft SQL Server · 在 Microsoft SQL Server 中 有 内 置 接 口 · 有 专 门 的 API 调 用 以 配 合 SQL Server 的 每 一 个 特 性 · 支 持 SQL Server 6.0 服 务 器 端 的 游 标 · 完 全 支 持 存 储 过 程 · 异 步 查 询 的 能 力 (比 如 后 台 查 询 处 理) · 对 键 集、 动 态、 静 态 和 只 能 向 前 卷 动 的 游 标 的 处 理 · 行 缓 冲 · 批 量 拷 贝 (BCP) 的 API · 完 全 由 中 断 驱 动 的 错 误 和 消 息 处 理 下 图 表 示 应 用 程 序 如 何 通 过 VBSQL 直 接 调 用 DB-Library 接 口。 DB-Library 通 过 网 络 接 口 程 序 把 数 据 传 递 至 SQL Server。 要 想 DB-Library 返 回 错 误 和 消 息, 应 用 程 序 中 必 须 有 VBSQL 定 制 控 件 以 产 生 回 调 事 件。 VBSQL API 代 码 → Visual Basic 程 序 ↑ VBSQL 定 制 控 件 ← → DB-Library ↑ 网 络 接 口 程 序 ↑ 得 到 这 些 功 能 的 同 时 要 付 出 代 价。 你 可 通 过 超 过 120 个 的 VBSQL 函 数 来 实 现 这 些 功 能。 同 时 你 必 须 自 己 负 责 管 理 连 接、 错 误 处 理、 数 据 获 取 和 数 据 缓 冲。 用 VBSQL 从 服 务 器 检 索 数 据 的 步 骤 ∶ 1 · 编 写 消 息 和 错 误 处 1 · 编 写 消 息 和 错 误 处 理 代 码 2 · 初 始 化 VBSQL 3 · 打 开 到 服 务 器 的 连 接 4 · 建 立 和 发 送 合 适 的 SQL 语 句 5 · 检 索 数 据 6 · 关 闭 连 接 一 般 来 讲, 如 果 你 需 要 完 成 非 常 高 效 的 异 步 后 台 操 作, 并 且 只 使 用 Microsoft SQL Server 的 专 用 特 性, 以 及 有 富 有 数 据 库 开 发 经 验 的 编 程 员, 则 可 考 虑 选 用 VB-SQL。 以 上 讨 论 的 内 容 并 不 指 定 你 在 某 个 特 定 应 用 上 应 该 用 那 种 方 法。 在 做 决 定 前, 你 还 需 要 考 虑 各 种 技 术 因 素 和 外 部 可 变 因 素 (例 如 编 程 员 的 背 景 和 水 平)。 我 们 在 为 桂 林 两 江 国 际 新 机 场 开 发 的 机 场 综 合 信 息 管 理 系 统 的 过 程 中, 就 充 分 利 用 了 上 述 四 种 编 程 模 型。 例 如, 对 强 调 实 时 响 应 的 报 文 处 理 子 系 统 采 用 ODBC API 进 行 重 新 编 程, 获 得 了 最 高 效 率。 对 原 来 已 经 开 发 完 成 的 集 中 控 制 子 系 统, 通 过 把 Data 控 件 转 换 成 RemoteData 控 件, 把 操 作 系 统 转 换 为 32 位 中 文 Windows 95, 也 显 著 提 高 了 执 行 速 度。 为 了 建 立 健 壮 (Robust)、 高 效 的 主 从 模 式 应 用, Visual Basic 4 还 率 先 给 互 相 协 作 的 开 发 者 们 提 出 了 三 层 服 务 体 系 结 构 的 概 念。 它 使 应 用 的 性 能、 安 全 性 和 易 用 性 又 有 了 新 的 提 高。 这 次 介 绍 了 编 程 模 型, 以 后 有 机 会 再 为 大 家 介 绍 这 种 服 务 模 型 (Services Model)。 Viusal Basic 4 还 有 这 里 没 有 谈 及 的 许 多 新 功 能, 希 望 大 家 能 够 共 同 探 讨, 开 发 出 更 好 的 主 从 模 式 应 用 系 统。 |