visual studio 2017使用OCCI連接oracle數據庫全過程解析


  因為項目要使用到VS連接oracle數據庫,所以有了這篇博文。

  首先,連接oracle數據庫有四種方法,OLD,ODBC,oracle developer tools for visual studio(ODT,這個是需要在oracle官網上下載相關的軟件支持的),最后一種方法就是今天要演示的使用OCCI連接oracle數據庫。前面的三種方法都是用.net框架去連接,最后一種使用的是C++的方式。

  據某篇博客說,OCCI的連接方式是這幾種連接方式中最好的一種,我表示,很贊同!!!

  我開始使用的是ODT的方式,也就是從oracle的官網上下載ODT的軟件包,要下載對應oracle數據庫的ODT軟件包,然后通過VS中工具-》連接到數據庫這個選項連接,這個方法要配置.osr文件,具體什么記不得了。但是這個方法我一直出現一個錯誤ORA-12154: TNS: 無法解析指定的連接標識符,具體的解決方案是,我也不知道。反正到最后我也沒有解決,下次有時間在來研究一下這個解決方案吧。

  接下來就介紹我如何通過OCCI成功連接上oracle的吧。

  首先需要確定你是用的oracle的版本,因為這將決定你是用的VS版本和OCCI軟件包版本。我在項目中使用的是oracle12C 12.2.0.1這個版本(注意64位和32位),這個版本中instant client這個是oracle數據庫的及時客戶端用來連接使用的。OCCI軟件包就在其中(這是后話了)。你確定要了oracle版本后,就確定好instant client的版本(注意64位和32位),你先下載下來,看下這個軟件包中使用的是VC幾的版本。這個VC版本將決定你是用的VS的版本。

  Visual Studio 6 : vc6
  Visual Studio 2003 : vc7
  Visual Studio 2005 : vc8
  Visual Studio 2008 : vc9
  Visual Studio 2010 : vc10
  Visual Studio 2012 : vc11
  Visual Studio 2013 : vc12
  Visual Studio 2015 : vc14

  至於我所使用的visual studio 2017,在安裝這2017的過程中,你會發現他所使用的VC版本是141,也就是14.1,為了安全起見,我在安裝vs2017的過程中,勾選了對vs2015工具包(v140)的支持,所以使用vs2017是沒有問題的。

  http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html    數據庫從這里下載

  http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html   instant client從這里下載,注意x64,x86和對應oracle的版本

  對於instant client 你需要下載的是 SDK 和 Basic兩個軟件包,對於我來說如下圖

 

  下載完數據庫之后,將數據庫安裝好,instant client解壓得到以下文件

  注意到,這個instant client使用的是VC14。

 如果你不想運行的時候把DLL拷貝到VS工作目錄中取,那么請設置系統環境變量PATH來引導系統找到這些DLL

  順便說一下,VS中對DLL的調用順序是

1.      當前進程的可執行模塊所在的目錄。

2.      當前目錄。

3.      Windows 系統目錄。GetSystemDirectory 函數檢索此目錄的路徑。(system32 和 syswow64)

這里需要特別指出的是對64位操作系統而言,system32是存放64位的DLL,syswow64存放的是32位的DLL。

4.      Windows 目錄。GetWindowsDirectory 函數檢索此目錄的路徑。

5.      PATH 環境變量中列出的目錄。

 

  之后進入到visual studio操作。

  

在C/C++=》附加包含目錄 中添加\sdk\include目錄

 

 在鏈接器=》常規=》附加庫目錄 中添加lib文件目錄 \sdk\lib\msvc\vc14

在鏈接器=》輸入=》附加依賴項 中添加上lib的名字,需要注意的是,文件中有兩個lib,一個是oraocci12.lib,另一個是oraocci12d.lib文件。第一個lib文件是用在release模式的,第二個lib文件是用在debug模式的。

   我的項目是x64,debug模式,所以只需要在附加依賴項中添加第二個用於debug模式的DLL文件。在選好之后,運行程序,你可能會缺少兩個DLL文件,分別是msvcr120d.dll 和 msvcp120d.dll 這兩個DLL文件,需要指出的是,這兩個DLL文件需要時64位的,因為項目是64位的。為了下載這兩個64位的DLL,我可是煞費苦心,我可以很負責任的告訴你,msvcr120d.dll 64位這個DLL你是百度不到的。不要問我為什么,國內沒有哪個DLL庫里面有這個DLL文件,當然,最后還是被我找到了。是在知乎上介紹了一個國外的DLL網站

  https://www.dll-files.com/msvcr120d.dll.html 就是這個網站,而且我還幫你找到了,記得謝謝我。

  下載完這兩個DLL,然后把它們扔到c\windows\system32中去,然后你就好了。不會遇到ORA-24960這個錯誤了。

  順便提下這個錯誤的原因,是因為你調用的是oraocci12.lib但是你是用的是debug模式。所以你需要將oraocci12.lib改成oracci12d.lib,那么我將這個兩個lib都加入呢,呵呵,我告訴你,如果你oraocci12.lib在前面,那么還會遇到這個錯誤,因為VS調用了這個lib,你添加oracci12d.lib這個文件就好了。

OK,附加上CPP代碼

#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 = "Lyw13507991186";
string srvName = "127.0.0.1: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;
}

你就能愉快的玩耍了!

 

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM