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")
//參考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