C++連接Oracle之OCCI

首先有關Oracle的occi網站上有很多不錯的博客,我也從上面找到了連接成功的案例,但是過程中還是存在了一定的錯誤,下面談一些過程中的問題及解決的方式。

環境:Windows7 64位

IDE:vs2013

服務器:oracle 11g

首先我們需要下載oracle的客戶端基本包和sdk包。

1.Instant Client Package - Basic、Instant Client Package - SDK兩個包的下載地址:https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html(注意兩個包的版本要一致)。

2.有些博客上說要下載occi接口,打開相關網站發現鏈接已經失效了,應該說官網不提供或者已經中基礎包中了,這裏我們需要把上面兩個包解壓到同一個目錄下。

然後解壓後所需要的C++開發的資源有:

1:所需的include頭文件在instantclient-sdk-nt-18.5.0.0.0\instantclient_18_5\sdk\include路徑下(Instant Client Package - SDK包)

2:lib文件在SDK包中:oraocci18.lib或者oraocci18d.lib

準備好相關的資源文件,下一步需要配置環境變量,這一步如果已經安裝過臨時客戶端,也就是配置過臨時客戶端就沒必要進行了,只需要將SDK包解壓放進去就好了,下面說環境變量的配置過程(相比臨時客戶端少了ora文件的配置)。

Path=D:\instantclient-basic-nt-18.5.0.0.0\instantclient_18_5(臨時客戶端所在目錄)

NLS_LANG=AMERICAN_AMERICA.ZHS16GBK(說是爲了防止亂碼,具體沒什麼感覺)

然後很重要的一步就是配置vs2013

    先創建一個空工程OCCIConnectOracle

1.  添加頭文件目錄:

解決方案中右鍵OCCIConnectOracle->屬性->c/c++->常規->附加包含目錄,中輸入庫目錄地址:D:\instantclient-sdk-nt-18.5.0.0.0\instantclient_18_5\sdk\include

2.  添加庫文件目錄:

屬性->鏈接器->常規->附加庫目錄:D:\instantclient-sdk-nt-18.5.0.0.0\instantclient_18_5\sdk\lib\msvc

(這裏有必要說一下,\msvc\vc14中也包含這兩個文件,但是添加後發現運行會提示無法打開外部符號的一些錯誤,相關的博客說說引用了debug版本的lib文件,具體的鏈接就不給了,因爲在其他電腦上)

3.  添加庫文件:

屬性->鏈接器->輸入->附加依賴項:此處有oraocci18.lib和oraocci18d.lib兩個文件,其中oraocci18.lib爲release模式時使用,oraocci18d.lib爲debug模式時使用。

代碼部分:

/***************************採用oracle本身提供OCCI方式操作數據庫*******************/  
  
//代碼的目的就是驗證makefile中oracle的頭文件和lib文件路徑是否正確了  
#include <iostream>  
#define WIN32COMMON //避免函數重定義錯誤  
#include <occi.h>  
using namespace std;  
using namespace oracle::occi;  
  
  
int main()  
{  
    system("pause");  
    //創建OCCI上下文環境  
    Environment *env = Environment::createEnvironment();  
    if (NULL == env) {    
            printf("createEnvironment error.\n");    
            return -1;    
        }  
    else  
        cout << "success" << endl;  
  
    string name = "system";  
    string pass = "123";  
    string srvName = "192.168.26.74:1521/orcl";  
  
    try  
    {     
        //創建數據庫連接  
        Connection *conn = env->createConnection(name, pass, srvName);//用戶名,密碼,數據庫名  
         if(NULL == conn) {    
            printf("createConnection error.\n");    
            return -1;    
        }  
         else  
            cout << "conn success" << endl;  
  
//  數據操作,創建Statement對象  
        Statement *pStmt = NULL;    // Statement對象  
        pStmt = conn->createStatement();    
        if(NULL == pStmt) {    
            printf("createStatement error.\n");    
            return -1;    
        }   
  
        // 查詢數據庫時間    
        std::string strTemp;   
        ResultSet *pRs = pStmt->executeQuery(    
            "SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL");    
        while(pRs->next()) {    
            strTemp = pRs->getString(1);    
            printf("db time:%s.\n", strTemp.c_str());    
            // int類型取值用getInt()    
            break;    
        }    
        pStmt->closeResultSet(pRs);         
          
        //--------插入---------    
        // 指定DML爲自動提交    
        pStmt->setAutoCommit(TRUE);    
        // 設置執行的SQL語句    
        //pStmt->setSQL("INSERT INTO TA (ID, NAME) VALUES (1, 'ZS')");    
        pStmt->setSQL("INSERT INTO TABLE_TEST_WANG (NAME, NUM, AGE) VALUES ('鄧超', '99', '41')");  
  
        // 執行SQL語句    
        unsigned int nRet = pStmt->executeUpdate();    
        if(nRet == 0) {    
            printf("executeUpdate insert error.\n");    
        }   
  
        // 終止Statement對象    
        conn->terminateStatement(pStmt);   
  
//  關閉連接  
        env->terminateConnection(conn);            
       // pEnv->terminateConnection(pConn);    
    }  
    catch (SQLException e)  
    {  
        cout << e.what() << endl;  
        system("pause");  
        return -1;  
    }  
  
  
// 釋放OCCI上下文環境    
    Environment::terminateEnvironment(env);  
    cout << "end!" << endl;  
    system("pause");  
    return 0;  
} 

一項運行時候的bug:

1.首先開始時候點擊運行提示無法打開各種文件,無法加載各種符號,查找了相關的解決方法(圖不在本機,不方便截圖)

解決方法:打開配置管理器->

然後:新建

最後:在新建平臺下拉菜單中選擇x64確定即可

上述問題可能因爲運行的一些程序組件因電腦說64位的原因導致,該解決方法能處理一些類似的錯誤。

問題2.運行時候提示缺少msv120p.dll文件(或者相關)

解決方法:最簡單的方式是從其他計算機上找到該文件複製,然後放到你自己計算機的window/system32文件夾中。

最後附個編譯好的代碼下載鏈接《後續補充》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章