摘要 本文介紹了使用Pro*C/C++在Visual C++環境下開發Oracle數據庫接口程序的方法
關鍵詞 程序設計數據庫接口程序Oracle
概述
在Visual C++下開發Oracle庫接口主要有兩種方法一種方法是利用Visual C++提供的多種數據庫訪問技術如開放數據庫連接ODBC數據存取對象DAO對象連接和嵌入數據庫OLE DB和ActiveX數據對象ADO等另一種方法是在Visual C++中嵌入SQL語句這就是所指的Pro*C/C++(本文簡稱PROC)前一種方法由於有MFC 強大的類庫支持熟悉VC編程時則實現方便且可移植性強但是與PROC 相比應用程序需要經過兩層才能和數據庫通信接口建立聯系編程相對復雜執行效率相對較低PROC支持嵌入式PL/SQL 塊等直接調用Oracle 庫將過程化語言和非過程化語言相結合形成一種更強的開發工具可開發出滿足各種復雜要求的優化應用程序執行效率高適合熟悉Oracle技術的人員應用但是用PROC 開發出的應用程序無法向異構數據庫平台移植
本文詳細描述實際利用PROC在Visual C++環境下開發Oracle數據庫接口程序的方法和具體操作步驟並給出了編程實例敘述以Visual C++ 版和Oraclei版為例其他版本可根據實際情況變更
幾個特殊文件
PROC在VC下開發Oracle庫接口時需要用到幾個特殊文件
PROC的可執行文件PROCUI EXE
用Oracle_HOME代表Oracle安裝後的根目錄當其以缺省方式安裝在計算機的D盤時則Oracle_HOME位置是D: \ Oracle這時PROC的可執行文件在Oracle_HOME \ Ora \ BIN \ PROCUI EXE對缺省安裝即在D: \ Oracle \ Ora \ BIN \ PROCUI EXE
Oracle支持SQL在VC環境的庫文件OraSQL LIB
根據以上約定OraSQL LIB文件在Oracle_HOME \ Ora \ PRECOMP \ LIB \ MSVC \ OraSQLLIB對缺省安裝即在D: \ Oracle \ Ora \ PRECOMP \ LIB \ MSVC \ OraSQLLIB
Oracle支持SQL在VC環境的頭文件
根據以上約定頭文件 *h在Oracle_HOME \ Ora \ PRECOMP \ PUBLIC \ *h對缺省安裝即在D: \ Oracle \ Ora \ PRECOMP \ PUBLIC \ *h
*h 是頭文件的總稱通常有十多個具體內容可在指定路徑下查到
將PROC集成到VC環境中
為了方便完成用PROC在VC下開發Oracle庫接口通常將PROC集成到Visual C++ 環境中直接在C / C++環境中使用PROC預編譯器來預編譯應用程序然後進行編譯和鏈接最終生成可執行程序將PROC集成到VC環境中應完成如下工作
增加PROC到Tools菜單列表
a) 運行Microsoft Visual C++
b) 從菜單項Tools中選擇Customize項為表述簡單起見書寫成如下格式菜單Tools/ Customize 項以下采用類似的表達方法此時出現Customize對話框
c) 單擊Tools選項卡(或屬性頁)用鼠標移動Menu contents框滾動條到底部區域
d) 雙擊點劃線矩形區域在空白區域上輸入PROC然後按回車鍵
e) 在Command框中輸入PROC的可執行文件名根據節的說明對缺省安裝即輸入D: \ Oracle \ Ora \ BIN \ PROCUI EXE
f) 在Arguments框中輸入$(TargetName)其作用在從菜單Tools中選擇PROC項時VC會將當前項目名傳遞給PROC爾後PROC會直接打開該項目文件目錄下擴展名為 pre的同名文件
g) 在Initial directory框中輸入$(WkspDir) / 單擊Close按鈕完成將PROC集成到VC環境中的工作
指定頭文件路徑
為了確保VC順利完成編譯鏈接需要將Oracle提供的頭文件增加到VC環境中指定頭文件路徑的具體步驟如下
a) 菜單Tools / Options項出現Options對話框
b) 單擊Directories選項卡從Show directories for:列表框中選擇Include files
c) 移動Directories框的滾動條到底部區域
d) 雙擊點劃線矩形區域在空白區域上輸入包含Oracle支持SQL在VC環境頭文件的子目錄根據節的說明對缺省安裝即輸入D: \ Oracle \ Ora \ PRECOMP \ PUBLIC
VC下開發Oracle接口程序過程
創建新工程
下面敘述中假定新建的工程名為Exam當運行Visual C++ 後操作步驟如下
a) 菜單File / New項 / Project卡
b) 選擇Win console Application 項
c) 由浏覽選擇或直接輸入工程將位於的路徑 / 填入創建的工程名如Exam
d) 單擊OK按鈕 / 依缺省值單擊Finish / 單擊OK完成創建控制台應用工程框架
創建預編譯源文件
假定創建的預編譯源文件名為Exampc在Visual C++ 的環境下操作步驟如下
a) 菜單Project / Add To Project 項 / New項
b) Files 卡 / SQL script File 項
c) Files編輯框中輸入Exampc / 單擊OK
d) 在編輯狀態下輸入Exampc源文件或者從其他文件中拷貝後再修改形成Exam pc源文件
e) 選擇恰當路徑保存源文件例如路徑為E: \ PROCW \ Exam
預編譯
通過預編譯將預編譯源文件如Exampc轉換成為Examc的C程序源文件在PROC集成到VC環境下時操作步驟如下
a) 菜單Tools / PROC 項
b) 當出現沒有Exampre 的對話框時單擊OK此時彈出PROC預編譯對話框
c) 利用菜單中的加入項或單擊+按鈕將進行預編譯的源文件如Exampc及其路徑添加到預編譯對話框的Input項中即Input項中出現E: \ PROCW \ Exam \ Exampc此時在Output項中自動顯示輸出文件如Examc和路徑(必要時可修改文件名和路徑)即Output項中出現E: \ PROCW \ Exam \ Examc
d) 若有需要雙擊預編譯對話框的Options選項處對彈出的Options選項對話框選擇需要的預編譯選項(一般情況下不做該步即采用缺省預編譯選項)
e) 單擊工具條最右邊的預編譯圖標進行預編譯
f) 預編譯結束若出現詢問保存Exampre 文件時應選擇OK進行保存完成預編譯
g) 如果預編譯結束預編譯對話框左邊顯示的狀態圖標為黃色(警告)或紅色(預編譯失敗)時應雙擊該標識觀察幫助或出錯信息預編譯失敗應當重做節中編輯工作修改源程序再進行預編譯直到通過預編譯
編譯准備
為了使工程能通過編譯需要將預編譯輸出的工程源文件和Oracle支持SQL在VC環境下的運行庫文件加入到工程中下面具體介紹增加這兩個文件的步驟
) 將預編譯的輸出文件加入工程
a) 菜單Project / Add To Project 項 / Files 項
b) 在文件對話框中選擇正確路徑(見節和節)選定預編譯輸出的文件如Examc單擊打開按鈕即將預編譯輸出的工程源文件加入工程
) 將運行庫文件加入工程
a) 菜單Project / Add To Project 項 / Files 項
b) 將文件對話框的文件類型改為所有文件
c) 路徑選為Oracle_HOME \ Ora \ PRECOMP \ LIB \ MSVC
d) 選擇OraSQLLIB文件單擊打開鈕完成將運行庫文件加入工程
編譯鏈接
a) 按F鍵或單擊編譯圖標對工程進行編譯鏈接如果沒有出現錯誤則通過編譯鏈接生成可執行文件如Examexe
b) 如果編譯鏈接出現錯誤返回到節選擇相應的預編譯源文件如Exampc進行修改並保存然後按節做預編譯預編譯通過後單擊OK按鈕用新的 c文件代替原來的C源文件此時重新按F鍵進行編譯鏈接直到排除所有錯誤生成可執行文件如Examexe
運行工程
a) 按Ctrl_F鍵或單擊執行圖標運行工程Examexe按工程中的提示逐步正確運行
b) 如果運行中出現錯誤返回到節修改相應預編譯源文件再按節做預編譯按節進行編譯鏈接生成新的可執行文件然後重新運行工程直到正確實現工程的規定任務
編程舉例
程序內容
一般SQL嵌入式程序主要有說明包含頭文件子程序聲明主程序和子程序等部分組成在主程序中調用有關子程序必備的子程序通常有連接到數據庫子程序斷開數據庫子程序錯誤處理子程序和完成某項具體事務(如查詢插入修改刪除等)的工作子程序
程序舉例
下面是一完整的可通過預編譯編譯鏈接和運行的示例程序
/* exampc 開發Oracle接口程序舉例 */
/* 說明本程序介紹用PROC開發Oracle庫接口的編程特點通過向AUTHS
* 表輸入作家代碼查詢作家姓名及工資運行前應建表插入數據並提交*/
#include
#include
#include
/* 包含SQL通訊區它用於處理錯誤*/
#include
void connect(); /* 連接到Oracle Server */
void disconnect(); /* 斷開到Oracle Server的連接 */
void sql_error(char *); /* 處理錯誤句柄 */
void select(); /* 查詢子程序 */
extern sqlglm(char *int *int *);
/* 主程序 */
void main()
{
/* 安裝錯誤處理句柄 */
EXEC SQL WHENEVER SQLERROR DO sql_error(Oracle錯誤\n);
/* 連接到數據庫 */
connect();
/* 執行查詢 */
select();
/* 斷開數據庫連接 */
disconnect();
}
/* 子程序 */
/* 連接子程序 connect() */
void connect()
{
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR username[] password[] server[];
EXEC SQL END DECLARE SECTION;
/* 輸入用戶名口令以及服務器名 */
printf(\n輸入用戶名);
gets(usernamearr);
usernamelen=(unsigned short)strlen((char *)usernamearr);
printf(\n輸入口令);
gets(passwordarr);
passwordlen=(unsigned short)strlen((char *)passwordarr);
printf(\n輸入服務器名);
gets(serverarr);
serverlen=(unsigned short)strlen((char *)serverarr);
/* 連接到Oracle服務器上 */
EXEC SQL CONNECT :username IDENTIFIED BY :password USING :server;
printf(\n以用戶%s成功地連接到了服務器%s上!\n usernamearr serverarr);
}
/* 斷開連接子程序 disconnect() */
void disconnect()
{
char temp;
printf(\n是否在斷開連接前提交所有事務? (Y/N));
scanf(%c &temp);
fflush(stdin);
if(temp !=Y && temp != y)
{
/* 回退事務斷開連接 */
EXEC SQL ROLLBACK WORK RELEASE;
printf(\n回退事務斷開連接退出程序!\n\n);
}
else
{
/* 提交事務斷開連接 */
EXEC SQL COMMIT WORK RELEASE;
printf(\n提交事務斷開連接退出程序!\n\n);
exit();
}
}
/* 查詢子程序 select()
* 首先輸入作家代碼然後查詢作家姓名和工資*/
void select()
{
EXEC SQL BEGIN DECLARE SECTION;
char author_code[] name[];
float salary;
short salary_ind;
EXEC SQL END DECLARE SECTION;
printf(\n輸入作家代碼: );
gets(author_code);
/* 查詢作家姓名和工資 */
EXEC SQL SELECT name salary INTO :name :salary:salary_ind
FROM auths
WHERE author_code = :author_code;
/* 根據指示變量的值來確定該作家的工資是否為空*/
if (salary_ind ==)
{
printf(\n作家代碼\t作家姓名\t作家工資\n);
printf(\t\t\n);
printf(%s\t%s\t%f\n author_code name salary);
}
else
{
printf(作家%s的工資未錄入為空值!\n name);
}
}
/* 錯誤處理子程序 sql_error() */
void sql_error(char *msg)
{
char err_msg[];
size_t buf_len msg_len;
/* 出現SQL錯誤繼續往下執行 */
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf(\n%s\n msg);
buf_len=sizeof(err_msg);
/* 調用函數sqlglm()獲得錯誤消息 */
sqlglm(err_msg &buf_len &msg_len);
printf(%*s\n msg_len err_msg);
/* 回退事務斷開連接退出程序 */
EXEC SQL ROLLBACK RELEASE;
exit(EXIT_FAILURE);
}
建表和插入數據記錄
上述示例程序如要正確運行還需以Oracle庫的合法用戶登錄並創建AUTHS表和插入一些數據記錄建表文件建表命令和插入數據記錄的示例命令如下所述這裡敘述的工作完成後上節生成的可執行文件才能正確運行
REM 以下為建表文件authsSQL
DROP TABLE auths CASCADE CONSTRAINTS
/
CREATE TABLE auths(
AUTHOR_CODE VARCHAR() NOT NULL
NAME VARCHAR()
BIRTHDATE DATE
ENTRY_DATE_TIME DATE
SALARY NUMBER()
remark VARCHAR())
/
REM 下一行為在PL/SQL環境中運行建表文件的命令
REM @ E: \ PROCW \ Exam \ authssql
REM 下一行為在PL/SQL環境中向auths表插入數據的命令插入後應提交(COMMIT)!
REM INSERT INTO auths(author_codenamesalary) VALUES(A王達琳);
From:http://tw.wingwit.com/Article/program/Oracle/201311/17563.html