VC下利用Pro*C開發(fā)Oracle接口
2024-08-29 13:41:17
供稿:網(wǎng)友
概述
在Visual C++下開發(fā)Oracle庫(kù)接口主要有兩種方法。一種方法是利用Visual C++提供的多種數(shù)據(jù)庫(kù)訪問技術(shù),如開放數(shù)據(jù)庫(kù)連接ODBC、數(shù)據(jù)存取對(duì)象DAO、對(duì)象連接和嵌入數(shù)據(jù)庫(kù)OLE DB和ActiveX數(shù)據(jù)對(duì)象ADO等。 另一種方法是在Visual C++中嵌入SQL語句,這就是所指的PRo*C/C++(本文簡(jiǎn)稱PROC)。前一種方法由于有MFC 強(qiáng)大的類庫(kù)支持,熟悉VC編程時(shí)則實(shí)現(xiàn)方便,且可移植性強(qiáng);但是,與PROC 相比,應(yīng)用程序需要經(jīng)過兩層才能和數(shù)據(jù)庫(kù)通信接口建立聯(lián)系,編程相對(duì)復(fù)雜,執(zhí)行效率相對(duì)較低。PROC支持嵌入式PL/SQL 塊等直接調(diào)用Oracle 庫(kù),將過程化語言和非過程化語言相結(jié)合,形成一種更強(qiáng)的開發(fā)工具,可開發(fā)出滿足各種復(fù)雜要求的優(yōu)化應(yīng)用程序,執(zhí)行效率高。適合熟悉Oracle技術(shù)的人員應(yīng)用。但是用PROC 開發(fā)出的應(yīng)用程序無法向異構(gòu)數(shù)據(jù)庫(kù)平臺(tái)移植。
本文具體描述實(shí)際利用PROC在Visual C++環(huán)境下開發(fā)Oracle數(shù)據(jù)庫(kù)接口程序的方法和具體操作步驟,并給出了編程實(shí)例。敘述以Visual C++ 6.0版和Oracle8i版為例,其他版本可根據(jù)實(shí)際情況變更。
幾個(gè)非凡文件
PROC在VC下開發(fā)Oracle庫(kù)接口時(shí),需要用到幾個(gè)非凡文件。
1、PROC的可執(zhí)行文件PROCUI. EXE
用Oracle_HOME代表Oracle安裝后的根目錄,當(dāng)其以缺省方式安裝在計(jì)算機(jī)的D盤時(shí),則Oracle_HOME位置是D: / Oracle。這時(shí)PROC的可執(zhí)行文件在Oracle_HOME / Ora81 / BIN / PROCUI. EXE,對(duì)缺省安裝即在D: / Oracle / Ora81 / BIN / PROCUI. EXE。
2、Oracle支持SQL在VC環(huán)境的庫(kù)文件OraSQL8. LIB
根據(jù)以上約定,OraSQL8. LIB文件在Oracle_HOME / Ora81 / PRECOMP / LIB / MSVC / OraSQL8.LIB,對(duì)缺省安裝即在D: / Oracle / Ora81 / PRECOMP / LIB / MSVC / OraSQL8.LIB。
3、Oracle支持SQL在VC環(huán)境的頭文件
根據(jù)以上約定,頭文件 *.h在Oracle_HOME / Ora81 / PRECOMP / PUBLIC / *.h,對(duì)缺省安裝即在D: / Oracle / Ora81 / PRECOMP / PUBLIC / *.h。
*.h 是頭文件的總稱,通常有十多個(gè),具體內(nèi)容可在指定路徑下查到。
將PROC集成到VC環(huán)境中
為了方便完成用PROC在VC下開發(fā)Oracle庫(kù)接口,通常將PROC集成到Visual C++ 6.0 環(huán)境中,直接在C / C++環(huán)境中使用PROC預(yù)編譯器來預(yù)編譯應(yīng)用程序,然后進(jìn)行編譯和鏈接,最終生成可執(zhí)行程序。將PROC集成到VC環(huán)境中應(yīng)完成如下工作。
1、增加PROC到Tools菜單列表
a) 運(yùn)行Microsoft Visual C++ 6.0;
b) 從菜單項(xiàng)Tools中選擇Customize項(xiàng)。為表述簡(jiǎn)單起見,書寫成如下格式:菜單Tools/ Customize 項(xiàng)。以下采用類似的表達(dá)方法。此時(shí)出現(xiàn)Customize對(duì)話框;
c) 單擊Tools選項(xiàng)卡(或?qū)傩皂?yè)),用鼠標(biāo)移動(dòng)“Menu contents”框滾動(dòng)條到底部區(qū)域;
d) 雙擊點(diǎn)劃線矩形區(qū)域,在空白區(qū)域上輸入“PROC”,然后按回車鍵;
e) 在“Command”框中,輸入PROC的可執(zhí)行文件名。根據(jù)2.1節(jié)的說明,對(duì)缺省安裝即輸入D: / Oracle / Ora81 / BIN / PROCUI. EXE;
f) 在“Arguments”框中輸入“$(TargetName)”。其作用在從菜單Tools中選擇PROC項(xiàng)時(shí),VC會(huì)將當(dāng)前項(xiàng)目名傳遞給PROC,爾后PROC會(huì)直接打開該項(xiàng)目文件目錄下擴(kuò)展名為 .pre的同名文件;
g) 在“Initial Directory”框中輸入“$(WkspDir)” / 單擊“Close”按鈕,完成將PROC集成到VC環(huán)境中的工作。
2、指定頭文件路徑
為了確保VC順利完成編譯鏈接,需要將Oracle提供的頭文件增加到VC環(huán)境中。指定頭文件路徑的具體步驟如下。
a) 菜單Tools / Options項(xiàng),出現(xiàn)“Options”對(duì)話框;
b) 單擊“Directories”選項(xiàng)卡,從“Show directories for:”列表框中選擇“Include files”;
c) 移動(dòng)“Directories”框的滾動(dòng)條到底部區(qū)域;
d) 雙擊點(diǎn)劃線矩形區(qū)域,在空白區(qū)域上輸入包含Oracle支持SQL在VC環(huán)境頭文件的子目錄,根據(jù)2.3節(jié)的說明,對(duì)缺省安裝即輸入D: / Oracle / Ora81 / PRECOMP / PUBLIC。
VC下開發(fā)Oracle接口程序過程
1、創(chuàng)建新工程
下面敘述中,假定新建的工程名為:Exam01。當(dāng)運(yùn)行Visual C++ 6.0后,操作步驟如下:
a) 菜單File / New項(xiàng) / Project卡;
b) 選擇Win32 console application 項(xiàng);
c) 由瀏覽選擇或直接輸入工程將位于的路徑 / 填入創(chuàng)建的工程名如Exam01;
d) 單擊OK按鈕 / 依缺省值單擊Finish / 單擊OK,完成創(chuàng)建控制臺(tái)應(yīng)用工程框架。
2、創(chuàng)建預(yù)編譯源文件
假定創(chuàng)建的預(yù)編譯源文件名為:Exam01.pc。在Visual C++ 6.0的環(huán)境下操作步驟如下:
a) 菜單Project / Add To Project 項(xiàng) / New項(xiàng);
b) Files 卡 / SQL script File 項(xiàng);
c) Files編輯框中輸入Exam01.pc / 單擊OK;
d) 在編輯狀態(tài)下輸入Exam01.pc源文件,或者,從其他文件中拷貝后再修改形成Exam01. pc源文件;
e) 選擇恰當(dāng)路徑,保存源文件。例如,路徑為:E: / PROCW / Exam01。
3、預(yù)編譯
通過預(yù)編譯,將預(yù)編譯源文件如Exam01.pc轉(zhuǎn)換成為Exam01.c的C程序源文件。在PROC集成到VC環(huán)境下時(shí)操作步驟如下:
a) 菜單Tools / PROC 項(xiàng);
b) 當(dāng)出現(xiàn)沒有Exam01.pre 的對(duì)話框時(shí)單擊OK,此時(shí)彈出PROC預(yù)編譯對(duì)話框;
c) 利用菜單中的加入項(xiàng)或單擊“+”按鈕,將進(jìn)行預(yù)編譯的源文件如Exam01.pc及其路徑添加到預(yù)編譯對(duì)話框的Input項(xiàng)中,即Input項(xiàng)中出現(xiàn)E: / PROCW / Exam01 / Exam01.pc。此時(shí)在Output項(xiàng)中自動(dòng)顯示輸出文件如Exam01.c和路徑(必要時(shí)可修改文件名和路徑),即Output項(xiàng)中出現(xiàn)E: / PROCW / Exam01 / Exam01.c;
d) 若有需要,雙擊預(yù)編譯對(duì)話框的Options選項(xiàng)處,對(duì)彈出的Options選項(xiàng)對(duì)話框,選擇需要的預(yù)編譯選項(xiàng)(一般情況下不做該步,即采用缺省預(yù)編譯選項(xiàng));
e) 單擊工具條最右邊的預(yù)編譯圖標(biāo),進(jìn)行預(yù)編譯;
f) 預(yù)編譯結(jié)束,若出現(xiàn)詢問保存Exam01.pre 文件時(shí),應(yīng)選擇OK進(jìn)行保存,完成預(yù)編譯;
g) 假如預(yù)編譯結(jié)束,預(yù)編譯對(duì)話框左邊顯示的狀態(tài)圖標(biāo)為黃色(警告)或紅色(預(yù)編譯失敗)時(shí),應(yīng)雙擊該標(biāo)識(shí)觀察幫助或出錯(cuò)信息。預(yù)編譯失敗,應(yīng)當(dāng)重做4.2節(jié)中編輯工作,修改源程序,再進(jìn)行預(yù)編譯,直到通過預(yù)編譯。
4、編譯預(yù)備
為了使工程能通過編譯,需要將預(yù)編譯輸出的工程源文件和Oracle支持SQL在VC環(huán)境下的運(yùn)行庫(kù)文件加入到工程中,下面具體介紹增加這兩個(gè)文件的步驟。
1) 將預(yù)編譯的輸出文件加入工程
a) 菜單Project / Add To Project 項(xiàng) / Files 項(xiàng);
b) 在文件對(duì)話框中選擇正確路徑(見4.2節(jié)和4.3節(jié)),選定預(yù)編譯輸出的文件如Exam01.c,單擊“打開”按鈕,即將預(yù)編譯輸出的工程源文件加入工程。
2) 將運(yùn)行庫(kù)文件加入工程
a) 菜單Project / Add To Project 項(xiàng) / Files 項(xiàng);
b) 將文件對(duì)話框的文件類型改為“所有文件”;
c) 路徑選為Oracle_HOME / Ora81 / PRECOMP / LIB / MSVC;
d) 選擇OraSQL8.LIB文件,單擊“打開”鈕,完成將運(yùn)行庫(kù)文件加入工程。
5、編譯鏈接
a) 按F7鍵或單擊編譯圖標(biāo),對(duì)工程進(jìn)行編譯鏈接。假如沒有出現(xiàn)錯(cuò)誤,則通過編譯鏈接,生成可執(zhí)行文件如Exam01.exe ;
b) 假如編譯鏈接出現(xiàn)錯(cuò)誤,返回到4.2節(jié),選擇相應(yīng)的預(yù)編譯源文件如Exam01.pc進(jìn)行修改并保存;然后按4.3節(jié)做預(yù)編譯,預(yù)編譯通過后,單擊OK按鈕用新的 .c文件代替原來的C源文件;此時(shí)重新按F7鍵進(jìn)行編譯鏈接,直到排除所有錯(cuò)誤,生成可執(zhí)行文件如Exam01.exe。
6、運(yùn)行工程
a) 按Ctrl_F5鍵或單擊執(zhí)行圖標(biāo)運(yùn)行工程Exam01.exe。按工程中的提示,逐步正確運(yùn)行;
b) 假如運(yùn)行中出現(xiàn)錯(cuò)誤,返回到4.2節(jié)修改相應(yīng)預(yù)編譯源文件,再按4.3節(jié)做預(yù)編譯,按4.5節(jié)進(jìn)行編譯鏈接,生成新的可執(zhí)行文件,然后重新運(yùn)行工程,直到正確實(shí)現(xiàn)工程的規(guī)定任務(wù)。
編程舉例
1、程序內(nèi)容
一般SQL嵌入式程序主要有說明、包含頭文件、子程序聲明、主程序和子程序等部分組成,在主程序中調(diào)用有關(guān)子程序。必備的子程序通常有連接到數(shù)據(jù)庫(kù)子程序、斷開數(shù)據(jù)庫(kù)子程序、錯(cuò)誤處理子程序和完成某項(xiàng)具體事務(wù)(如查詢、插入、修改、刪除等)的工作子程序。
2、程序舉例
下面是一完整的可通過預(yù)編譯、編譯鏈接和運(yùn)行的示例程序。
/* exam01.pc 開發(fā)Oracle接口程序舉例 */
/* 說明:本程序介紹用PROC開發(fā)Oracle庫(kù)接口的編程特點(diǎn)。通過向AUTHS
* 表輸入作家代碼,查詢作家姓名及工資。運(yùn)行前應(yīng)建表、插入數(shù)據(jù)并提交。*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* 包含SQL通訊區(qū),它用于處理錯(cuò)誤。
*/
#include <sqlca.h>
void connect(); /* 連接到Oracle Server */
void disconnect(); /* 斷開到Oracle Server的連接 */
void sql_error(char *); /* 處理錯(cuò)誤句柄 */
void select(); /* 查詢子程序 */
extern sqlglm(char *,int *,int *);
/* 主程序 */
void main()