OCCI入門(VC2010下配置)


剛剛在vs2010下配置成功,麻煩非常多。

Oracle相關下載地址:
http://www.oracle.com/technetwork/indexes/downloads/index.html 

Instant Client是即時客戶端,普通的客戶端最高版本是11.2.0.1.0,
即時客戶端支持到最新11.2.0.3.0

支持VC2010的類庫下載(目前只支持 11.2.0.3.0和11.2.0.3.0客戶端 ):
http://www.oracle.com/technetwork/database/occidownloads-083553.html 

可能是類庫與客戶端版本不匹配,建立的連接有問題。
debug下運行正常,release下去始終運行出錯,不知何故。

2012-09-22補充
1.下載安裝11.2.0.3.0普通客戶端解決了release無法運行問題。
2.編譯通過運行出錯兩個問題:
2.1環境變量ORACLE_HOME問題
如果有多個客戶端會沖突,則這句運行不過去。
Environment  *env = Environment::createEnvironment();  
刪除ORACLE_HOME通過注冊表設置路徑。
2.2無法建立連接,下面這句運行不過去。
Connection  *conn = env->createConnection("uid", "pwd","oracle_svr_name"); 
打開服務器端正確創建監聽器(LISTENER)和服務。

在VC++中使用OCCI

 1.簡介
Windows下訪問Oracle數據庫可以使用ADO,ADO.Net,OLEDB,ODBC,跨平台的OCCI等方法,其中速度最快,對Oracle支持最完整的是Oracle提供的OCCI.

2. 安裝 OCCI SDK
OCCI SDK 包含在 Oracle 客戶端中,在如下位置可以找到:
頭文件: C:\oracle\ora92\oci\include
庫文件: C:\oracle\ora92\oci\lib\msvc
 
推薦安裝 Oracle 即時客戶端( Instant Client ),它也包含有 OCCI SDK
頭文件: instantclient_10_2\sdk\include
庫文件: instantclient_10_2\sdk\lib\msvc
 
3. 編譯 OCCI 程序
關於在 VC 下如何編譯,調試 OCCI 程序,參見下面
 
4.OCCI 編程步驟
 
4.1  連接到數據庫
 
// 創建 OCCI 上下文環境
Environment  *env = Environment::createEnvironment();
assert ( env != NULL );
 
// 創建數據庫連接
Connection  *conn = env->createConnection("uid", "pwd","oracle_svr_name");
 
//...
// todo: 插入自己的代碼
 
// 關閉連接
env -> terminateConnection ( conn );
// 釋放
Environment :: terminateEnvironment ( env );
 
4.2  執行基本的 SQL 語句
// 創建 SQL 語句控制句柄
Statement  *stmt = conn->createStatement();
 
a. 執行一般的 SQL 語句
stmt -> executeUpdate ( "Create TABLE basket_tab (fruit VARCHAR2(30), quantity NUMBER)" );
stmt -> executeUpdate ( "delete basket_tab" );
 
b. 重復利用 SQL 語句 , 參數化的 SQL 語句
//:1,:2 是參數占位符
stmt -> setSQL ( "Insert INTO basket_tab VALUES(:1,:2)" );
//  第一個參數
stmt -> setString (1,  "Bananas");
//  第二個參數
stmt -> setInt (2,  5);
stmt -> executeUpdate ();
 
  c. 一次修改多行數據
// 最多允許的迭代次數,注意這個參數需要在 setXXX 系列函數之前執行
stmt -> setMaxIterations ( int  maxIterations);
// 指定某個參數的大小, string byte 需要
stmt -> setMaxParamSize ( int  parameterIndex, int maxParamSize);
 
for (...)
{
    //  第一個參數
    stmt->setString(1, "Bananas");
    //  第二個參數
    stmt->setInt(2, 5);
 
    // 増加一行記錄,類似於 ADO AddNew
    pStmt->addIteration();
}
 
stmt -> executeUpdate ();
 
d. 執行查詢:獲取結果集 ( 記錄集 )
ResultSet  *rs = stmt->executeQuery("Select * FROM basket_tab");
while  (rs->next())
{
    string fruit = rs->getString(1); // get the first column as string
    int quantity = rs->getInt(2); // get the second column as int
}
 
// 關閉結果集
stmt -> closeResultSet ( rs );
 
e. 執行存儲過程
// 指定存儲過程 countFruit
stmt -> setSQL ( "BEGIN countFruit(:1, :2); END:" );
// 設置第一個參數
stmt -> setString (1,  "Apples");
 
int  quantity;
// 注冊輸出參數
stmt -> registerOutParam (2,  Type::OCCIINT, sizeof(quantity));
 
// 執行此存儲過程
stmt -> executeUpdate ();
 
// 釋放 SQL 語句控制句柄
conn -> terminateStatement ( Statement  *stmt);
 
4.3  事務
所有的 DDL 默認開始並自動提交一個事務
所有的 DML 默認開始一個事務,且不會自動提交
 
// 可以指定 DML 是否自動提交
stmt -> setAutoCommit ( TRUE / FALSE );
 
// 也可以手動提交或回滾。
conn -> commit ();
conn -> rollback ();
 
4.4  異常處理
try
{
    //OCCI 程序
}
catch  (SQLException &sqlExcp)
{
    cerr <<sqlExcp.getErrorCode << ": " << sqlExcp.getErrorMessage() << endl;
}
catch  (exception &excp)
{
    cerr << excp.what() << endl;
}

VC++調試OCCI程序的關鍵設置

#define WIN32COMMON
//解決error C2995: 'getVector' : template function has already been defined

#include <occi.h>
using namespace oracle::occi;

#pragma comment(lib,"oci.lib")
#pragma comment(lib,"ociw32.lib")
#pragma comment(lib,"oraocci10.lib")

//解決無法調試OCCI的問題
//參考sdk\demo目錄下的make.bat

對於VS2003:

1.項目屬性 -> C/C++ -> 代碼生成 -> 運行時庫 -> 多線程調試 DLL (/MDd)
2.項目屬性 -> 鏈接器 -> 輸入 -> 附加依賴項 -> msvcrt.lib msvcprt.lib


對於VC++6.0
1.Project Settings -> C/C++ -> Code Generation -> Use run-time library: -> Debug Multithreaded DLL
2.Project Settings -> Link -> Object/library modules:末尾添加
msvcrt.lib msvcprt.lib  

url: http://greatverve.cnblogs.com/archive/2012/09/08/occi-vc2010.html


免責聲明!

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



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