用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.anti-gravitydesign.com