天天看點

OCCI程式設計接口介紹OCCI簡介安裝OCCI開始編碼常見錯誤處理

Oracle® C++ Call Interface (OCCI) 是一套應用程式程式設計接口,它允許C++程式與一個或者多個Oracle資料庫進行互動.OCCI給予你強大的資料庫操作能力,比如說執行SQL,處理存儲過程等.

OCCI主要是提供給有以下需求的使用者:

希望借助系統記憶體和網絡連接配接的合理使用,開發高性能的應用程式.

開發可伸縮的應用程式,以滿足資料庫使用者和請求的不斷增長.

支援通路資料庫對象.

簡化使用者認證和密碼管理.

支援多層認證模式

兩層C/S環境或者多層環境下,動态連接配接管理和事務管理的一緻性接口.

注: OCCI不支援Non-Blocking(非阻塞)模式.

由于OCCI是以動态庫方式導出的類庫,是以對平台和編譯器的依賴性比較強,是以需要根據不同平台,不同編譯器取得對應的OCCI接口,并且在自己的程式中連結OCCI的庫:

OCCI程式設計接口介紹OCCI簡介安裝OCCI開始編碼常見錯誤處理

一般情況下OCCI會随着oracle資料安裝,附帶安裝到某個目錄下,不過對于僅僅需要做相關開發的人員來說,這個動作”太大了”,選擇安裝即時用戶端是一個不錯的選擇,小巧,便于配置,功能完善(對于應用程式開發來說).

我們需要到oracle的網站上下載下傳以下幾個東西:

instantclient-basic (一些基礎元件)

instantclient-sdk (開發包,即相關的頭檔案和庫檔案)

occi (能正确比對你的開發環境的OCCI庫)                       

雖然instantclient-sdk裡已經有了lib和頭檔案,但occi仍然需要單獨下載下傳,因為

instantclient-sdk 隻有發行版本的lib和動态庫,對于開發和調試來說是不夠的.

instantclient-sdk 中的動态庫不能直覺的判斷其CRT庫的依賴版本

有一個地方還需要注意,OCCI版本并不是很全,因為它有太多的東西需要對号入座,如開發者的編譯器類型,編譯器版本,作業系統(x86,x64),Oracle用戶端(包含即使用戶端)版本.是以盡管OCCI有不少的發行版本,但輪到你具體選擇的時候就不多了,比如說你想找支援VC2008的OCCI,你就隻能選Oracle11的用戶端了,因為Oracle隻發行了這樣一個版本同支援VC2008.

回到安裝的話題上,假設你用windows +VC2008,你需要下載下傳 instantclient-basic-win32-11.1.0.6.0.zip,instantclient-sdk-win32-11.1.0.6.0.zip,occivc9win32_111060.zip.為什麼要選11.0.6這個版本?因為我們的開發環境決定了隻能找到11.1.6.0這個版本的OCCI庫.

先将下載下傳到的instantclient-basic 解壓到C:\ora_env.那麼它下面應該有sdk;vc8;vc8;vc71這4個檔案夾. 将instantclient-sdk-win32-11.1.0.6.0.zip中的sdk目錄放在C:\ora_env下. 在C:\ora_env下建立檔案夾vc9,将occivc9win32_111060.zip中的4個檔案(oraocci11.dll,oraocci11d.dll,oraocci11.dll.manifest,oraocci11d.dll.manifest)放在裡面. 在C:\ora_env\sdk\lib\msvc下建立目錄vc9,将occivc9win32_111060.zip中的 oraocci11.lib,oraocci11d.lib放在這個目錄裡. 将C:\ora_env\vc9;C:\ora_env;加入PATH環境變量(最好放在前面). 建立一個環境變量TNS_AMDIN,值為C:\ora_env\;tnsnames.ora檔案應該放在這個目錄下. 建立一個環境變量NLS_LANG,值為SIMPLIFIED CHINESE_CHINA.ZHS16GBK(這個值根據自己的情況定). 删除C:\ora_env下的oraocci11.dll和oraocci11.sym,這個庫檔案不是連結到VC2008的CRT,C:\ora_env\vc9才是正确的DLL,同時也能更明确表達我們的是使用VC2008開發環境的這樣一個情況. C:\ora_env\sdk\lib\msvc下的oraocci11.lib 也應該删除,原理同上. 将C:\ora_env\sdk\lib\msvc\vc9加入VC2008庫檔案搜尋路徑. 将C:\ora_env\sdk\include加入VC2008頭檔案搜尋路徑.

linux下的配置過程基本一樣,但動态庫檔案(.so)的路徑(對應于windows環境下的C:\ora_env\vc9)應該加入到LD_LIBRARY_PATH環境變量中.

配置工作做完後,可以寫一點代碼,測試一下

OCCI程式設計接口介紹OCCI簡介安裝OCCI開始編碼常見錯誤處理

View Code

代碼中的資料庫連接配接字元串跟一般我們常用的有點不同,連接配接字元串可以有下面兩種寫法:

host:[port][/service name]

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=127.0.0.1) (PORT=5521)) 

(CONNECT_DATA=(SERVICE_NAME=SRV_NAME)))

第二種就是跟tnsnames.ora中的内容一樣的了.

分享一些在開發和測試的過程中,經常會遇見一些常見的問題(win + VC).

編譯代碼時,發現大量錯誤,都是說某些CRT函數名稱重複.

原因中多半是同一個項目靜态連結了兩個不同版本的CRT庫.比如VC2005的程式A依賴VC2008的程式B(B使用OCCI),B的代碼生成方式為/MT或者/MTd.

将上面的場景中,程式B的代碼生成方式改成/MD或者/MDd後,編譯通過,但是程式運作發生崩潰.

很可能是代碼中的某個對象産生和釋放分别調用了不同的CRT(一個是VC2005的,一個是VC2008的).解決辦法:沒有什麼好的解決辦法,最好還是統一開發環境吧,C++導出的類不适合跨環境.

出現ORA-24960錯誤

你的項目是debug版本,但連結了release版本的occi庫.

出現R6034錯誤

OCCI庫跟你的VC版本不一緻.

調試時,發現堆棧被莫名其妙的破壞

同上,或者OCCI的debug與release版本跟目前項目的設定不比對.

找不到MSVCR90.DLL

記得讓你的客戶安裝VC9的redist.

找不到MSVCR90D.DLL

你釋出的程式是調試版本的,雖然你的使用者安裝了VC9的redist,那也是沒用的,因為redist隻會安裝release版本的運作時庫.

參考資料:

<Oracle® C++ Call Interface Programmer's Guide>

文章資訊