首先有關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文件夾中。
最後附個編譯好的代碼下載鏈接《後續補充》