用VC开发基于ORACLE数据库应用程序的两种方法

发表于:2007-07-14来源:作者:点击数: 标签:
1. 引 言 ORACLE 公 司 自1979 年 推 出 基 于SQL 标 准的 关 系 数 据 库 产品 到1997 年 版 本8 的 推 出,ORACLE 数 据 库 以其 支 持 大 数 据 库、 多 用 户 的 高 性 能 事 务 处 理, 对 业 界各 项 工 业 标 准 的 支持, 完 整 的 安 全 和 完 整
  1. 引 言
ORACLE 公 司 自1979 年 推 出 基 于SQL 标 准的 关 系 数 据 库 产品 到1997 年 版 本8 的 推 出,ORACLE 数 据 库 以其 支 持 大 数 据 库、 多 用 户 的 高 性 能 事 务 处 理, 对 业 界各 项 工 业 标 准 的 支持, 完 整 的 安 全 和 完 整 性 控 制, 支持 分 布 式 数 据 库 和 分布 处 理, 具 有 可 移 植 性、 可 兼 容性 和 可 连 接 性 等 突 出 优点 倍 受 用 户 喜 爱, 根 据IDG1992 年全 球UNIX 数 据 库 的 市 场 报告,ORACLE 占 市 场 销 售 量 的50%。 而在 客 户 端 的 开 发 工 具 方面,Visual C++ 也 因 其 强 大 的 功 能和 高 度 的 灵 活 性 等 特 点 深 受 广 大 程 序 员 的 喜 爱, 因 此本 文 旨 在 介 绍 使 用Visual C++ 开 发 基 于ORACLE 数 据 库 应 用 程序 的 两 种 方 法。


2. 使 用PRO*C 开 发 数 据 库 应 用
2.1 PRO*C 工 作 原 理

PRO 系 列 是ORACLE 公 司 提 供 的 在 第 三代 高 级 程 序 设 计 语 言 中 嵌 入SQL 语 句 来 访 问 数 据 库 的 一套 预 编 译 程 序, 包 括PRO*Ada、PRO*C、PRO*COBOL、PRO*Fortran、PRO*Pascal 和PRO*PL/I 六 种。 程 序 员 用 相 应 的 高 级 语 言 编 写 嵌 入SQL 语句 的PRO 源 程 序( 若 用C 语 言 则 称 为PRO*C 源 程 序) 后 运 行 相应 的 预 编 译 程 序, 把 嵌 入 的SQL 语 句 转 换 为 标 准 的ORACLE 调 用 并 生 成 目 标 源 程 序, 即 纯 高 级 语 言 格 式 的 源 程序, 然 后 就 可 以 将 这 些 源 程 序 加 入 用 户 的 程 序 中 调用, 其 处 理 过 程 如 下 图。

ORACLE 预 编 译 程 序 提 供 如 下 功 能:

⑴ 能 用 六 种 通 用 的 高 级 程 序 设计 语 言 中 的 任 何 一 种 编 写 应 用 程 序。

⑵ 遵 循ANSI 标 准, 在 高 级 语 言 中嵌 入SQL 语 句。

⑶ 可 采 用 动 态SQL 方 法, 让 程 序 在运 行 时 接 受 或 构 造 一 个 有 效 的SQL 语 句。

⑷ 实 现ORACLE 内 部 数 据 类 型 和 高 级语 言 数 据 类 型 之 间 的 自 动 转 换。

⑸ 可 通 过 在 应 用 程 序 中 嵌 入PL/SQL 事 物 处 理 块 来 改进 性 能。

⑹ 能 在 程 序 行 和 命 令 行 上 指 定所 需 要 的 预 编 译 可 选 项, 并 可 在 预 编 译 的 过 程 中 改 变它 们 的 值。

⑺ 能 全 面 检 查 嵌 入 的SQL 数 据 操纵 语 句 和PL/SQL 块 的 文 法 和 语 义。

⑻ 可 用SQL*Net 并 行 存 取 多 个 地 点的ORACLE 数 据 库。

⑼ 可 把 数 组 作 为 输 入 和 输 出 程序 变 量 使 用。

⑽ 能 对 应 用 程 序 中 的 代 码 段 进行 条 件 预 编 译。

⑾ 提 供 了 较 强 的 异 常 处 理 功能。

由 此 可 见, 通 过 预 编 译 程 序 与其 它 高 级 语 言 的 结 合, 既 可 以 利 用SQL 强 有 力 的 功 能 和灵 活 性 为 数 据 库 应 用 系 统 的 开 发 提 供 强 有 力 的 手 段,又 可 以 充 分 利 用 高 级 语 言 自 身 在 系 统 开 发 方 面 的 优势, 从 而 提 供 一 个 完 备 的 基 于ORACLE 数 据 库 应 用 程 序 的开 发 解 决 方 案。

2.2 在VC 中 使 用PRO*C

每 个PRO*C 源 文 件 一 般 由 程 序 头 和程 序 体 两 部 分 组 成。程 序 头 包 含 宿 主 变 量(SQL 语 句 中所 包 含 的 变 量) 说 明、通 讯 区 定 义 和C 外 部 表 示 符 的 说明 等。 程 序 体 一 般 是 由 若 干 函 数 组 成, 这 些 函 数 内 含有SQL 语 句( 以EXEC SQL 起 头 的 语 句)。

PRO*C 支 持 的 数 据 类 型 包 括VARCHAR2( 变 长 字 符 串)、NUMBER( 二 进 制 数)、INTGER( 有 符 号 整数)、FLOAT( 浮 点 数)、STRING( 以NULL 结 尾 的 字 符 串)、VARNUM( 变 长 二 进 制 数)、LONG( 变 长 字 符 串)、VARCHAR( 变 长 字 符 串)、ROWID( 二 进 制 值)、DATE( 定长 日 期/ 时 间 值)、VARRAW( 变 长 二 进 制 数 据)、RAW( 定 长 二 进制 数 据) 、LONGRAW( 变 长 二 进 制 数 据)、UNSIGNED( 无 符 号 整 数)、ONGVARCHAR( 变 长 字 符 串)、LONGVARRAW( 变 长 二 进 制 数 据)、CHAR( 定 长 字 符串)、CHARZ(C 中 定 长 以NULL 结 尾 的 字 符 串)、MLSLABEL( 变 长 二 进制 数 据)。

在PRO*C 中 不 能 使 用'l' 或'u' 作 词 尾或'0x' 作 词 头 修 饰 常 量; 在SQL 语 句 中 使 用 单 引 号 来 定 义字 符 串, 用 双 引 号 来 定 义 特 殊 的 或 小 写 字 符 的 标 识 符( 如 表 名 等);SQL 语 句 中 不 允 许 使 用C 中 的 寻 址、 间 接、 位逻 辑、 复 合 赋 值、?=、-、++、%、<<、>> 操 作 符 并 且 用NOT、AND、OR、= 代 替!、&&、||、==。

下 面 的 程 序 是 一 个 联 结 数 据 库的PRO*C 源 程 序 例 子。


#include // 声 明SQL 通 讯 区

#include

#include

EXEC SQL BEGIN DECLARE SECTION;

VARCHAR username[20]; // 声 明 宿 主 变 量

VARCHAR password[20];

VARCHAR dbname[20];

EXEC SQL END DECLARE SECTION;

void db_connect()

{

strcpy((char *)username.arr,"SCOTT");

username.len = strlen((char *)username.arr);

strcpy((char *)password.arr,"TIGER");

password.len = strlen((char *)password.arr);

strcpy((char *)dbname.arr,"SUNDB");

dbname.len = strlen((char *)dbname.arr);

EXEC SQL WHENEVER SQLERROR STOP;

// 隐 式 异 常 处 理

EXEC SQL CONNECT :

username IDENTIFIED BY :password USING :dbname;

/*if (sqlca.sqlcode != 0)



// 显 式 异 常 处 理

{

AfxMessageBox("\n 与 Oracle 数 据 库 连 接 失 败!");


return;

}*/

}
在VC 中 使 用PRO*C 时, 先 用PRO*C 编 写所 需 的 操 作 数 据 库 的 子 程 序, 再 运 行PRO*C 预 编 译 程 序把PRO*C 源 程 序 转 成 相应 的CPP 源 程 序, 将 该 程 序 插 入 到 用户 工 程 文 件 中 并 在 需 要 对 插 入 函 数 进 行 调 用 的 模 块中 说 明 函 数, 然 后 就 可以 在 此 模 块 中 调 用 所 需 的 函数。

3. 使 用ODBC 中 间 件 访 问 数 据 库
3.1 ODBC 工 作 原 理

ODBC 是Open Database Connect 即 开 放 数 据 库互 连 的 简 称, 它 是 由Microsoft 公 司 于1991 年 提 出 的 一 个 用于 访 问 数 据 库 的 统 一 界 面 标 准, 是 应 用 程 序 和 数 据 库系 统 之 间 的 中 间 件。 它 通 过 使 用 相 应 应 用 平 台 上 和 所需 数 据 库 对 应的 驱 动 程 序 与 应 用 程 序 的 交 互 来 实 现对 数 据 库 的 操 作,避 免 了 在 应 用 程 序 中 直 接 调 用 与 数据 库 相 关 的 操 作,从 而 提 供 了 数 据 库 的 独 立 性。

ODBC 主 要 由 驱 动 程 序 和 驱 动 程 序管 理 器 组 成。 驱 动 程 序 是 一 个 用 以 支 持ODBC 函 数 调 用 的模 块( 在WIN95 下 通常 是 一 个DLL), 每 个 驱 动 程 序 对 应 于相 应 的 数 据 库, 当应 用 程 序 从 基 于 一 个 数 据 库 系 统 移植 到 另 一 个 时, 只 需 更 改 应 用 程 序 中 由ODBC 管 理 程 序 设定 的 与 相 应 数 据 库 系 统 对 应 的 别 名 即 可。 驱 动 程 序 管理 器( 包 含 在ODBC32.DLL 中) 可 链 接 到 所 有ODBC 应 用 程 序 中,它 负 责 管 理应 用 程 序 中ODBC 函 数 与DLL 中 函 数 的 绑 定。

ODBC 使 用 层 次 的 方 法 来 管 理 数 据库, 在 数 据 库 通 信 结 构 的 每 一 层, 对 可 能 出 现 依 赖 数据 库 产 品 自 身 特 性的 地 方,ODBC 都 引 入 一 个 公 共 接 口 以解 决 潜 在 的 不 一 致性, 从 而 很 好 地 解 决 了 基 于 数 据 库系 统 应 用 程 序 的 相 对 独 立 性, 这 也 是ODBC 一 经 推 出 就 获得 巨 大 成 功 的 重 要 原 因 之 一。

从 结 构 上 分,ODBC 分 为 单 束 式 和多 束 式 两 类。

⑴ 单 束 式 驱 动 程 序

单 束 式 驱 动 程 序 介 于 应 用 程 序和 数 据 库 之 间, 像 中 介 驱 动 程 序 一 样 数 据 提 供 一 个 统一 的 数 据 访 问 方 式。

当 用 户 进 行 数 据 库 操 作 时, 应用 程 序 传 递 一 个ODBC 函 数 调 用 给ODBC 驱 动 程 序 管 理 器, 由ODBC API 判 断 该 调 用 是 由 它 直 接 处 理 并 将 结 果 返 回 还 是 送交 驱 动 程 序 执 行 并将 结 果 返 回。

由 上 可 见, 单 束 式 驱 动 程 序 本身 是 一 个 数 据 库 引 擎, 由 它 直 接 可 完 成 对 数 据 库 的 操作, 尽 管 该 数 据 库 可 能 位 于 网 络 的 任 何 地 方。

多 束 式 驱 动 程 序
多 束 式 驱 动 程 序 负 责 在 数 据 库引 擎 和 客 户 应 用 程 序 之 间 传 送 命 令 和 数 据, 它 本 身 并不 执 行 数 据 处 理 操 作 而 用 于 远 程 操 作 的 网 络 通 信 协议 的 一 个 界 面。

前 端 应 用 程 序 提 出 对 数 据 库 处理 的 请 求, 该 请 求 转给ODBC 驱 动 程 序 管 理 器, 驱 动 程 序管 理 器 依 据 请 求 的 情 况, 就 地 完 成 或 传 给 多 束 驱 动 程序, 多 束 式 驱 动 程 序 将 请 求 翻 译 为 特 定 厂 家 的 数 据 库通 信 接 口( 如Oracle 的SQLNet) 所 能 理 解 的 形 式 并 交 于 接 口去 处 理, 接 口 把 请 求 经 网 络 传 送 给 服 务 器 上 的 数 据 引擎, 服 务 器 处 理 完 后 把 结 果 发 回 给 数 据 库 通 信 接 口,数 据 库 接 口 将 结 果 传 给 多 束 式ODBC 驱 动 程 序, 再 由 驱 动程 序 将 结 果 传 给 应 用 程 序。

3.2 在VC 中 使 用ODBC

Visual C++ 中 提 供 了CDatabase、CRecordset、CRecordView、CDBException 和CFieldExchange 五 个 类, 这 些 类 封 装 了ODBC SDK 函 数, 从 而 使用 户 可 以 无 需 了 解SDK 函 数 就 可 以 很 方 便 地 操 作 支 持ODBC 的 数 据 库。

CDatabase 类: 封 装 了 与 数 据 库 建 立连 接, 控 制 事 务 的 提 交 和 回 滚 及 执 行SQL 语 句 的 方 法。

CRecordset 类: 封 装 了 大 部 分 操 纵 数据 库 的 方 法, 包 括 浏 览、 修 改 记 录, 控 制 游 标 移 动,排 序 等 操 作。

CRecordView 类: 提 供 了 与recordset 对 象相 连 接 的 视, 可 以 建 立 视 中 的 控 件 与 数 据 库 数 据 的 对应, 同 时 支 持 移 动 游 标, 修 改 记 录 等 操 作。

CDBException 类: 提 供 了 对 数 据 库 操作 的 异 常 处 理, 可以 获 得 操 作 异 常 的 相 关 返 回 代 码。

CFieldExchange 类: 提 供 了 用 户 变 量 与数 据 库 字 段 之 间 的 数 据 交 换, 如 果 不 需 要 使 用 自 定 义类 型, 你 将 不 用 直 接 调 用 该 类 的 函 数,MFC Wizard 将 自 动为 程 序 员 建 立 连 接。


4. 两 种 方 法 的 比 较
综 上 所 述, 使 用 这 两 种 方 法 在Visual C++ 中 都 可 以 很 方 便 地 开 发 出 基 于ORACLE 数 据 库 的 应 用 程序, 同 时, 这 两 种 方 法 又 各 有 其 优 缺 点。ODBC 由 于 有MFC 强 大 的 类 库 支 持 而 使 得 编 程 实 现 非 常 方 便, 同 时 可 移植 性 也 很 强, 在 异 构的 数 据 库 之 间 移 植 也 只 需 更 改 很少 的 一 部 分 程 序, 但 是, 由ODBC 的 实 现 机 制 我 们 可 以 看到, 与PRO*C 相 比, 应 用 程 序 需 要 经 过ODBC 驱 动 程 序 管 理 器和ODBC 驱 动 程 序 两 层 才 能 和 数 据 库 通 信 接 口 建 立 联 系,而PRO*C 是 直 接 与 通 信 接 口 联 系, 因 此 建 立 在ODBC 上 应 用程 序 的 执 行 效 率 会 相 对 低 一 些。PRO*C 具 有 执 行 效 率 高,支 持 嵌 入 式PL/SQL 块 等ORACLE 自 身 特有 的 优 点, 但 正 因 为 有了 这 些 优 点, 使 得 用PRO*C 开 发 出 的 应 用 程 序 无 法 向 异构 数 据 库 平 台 移 植。 

原文转自:http://www.ltesting.net