方案選擇
| 方案 | 優點 | 缺點 |
| OCCI (Oracle C++ Call Interface) | 面向對象、C++ 風格、官方支持 | 需安裝 Instant Client SDK、版本綁定 |
| OCI (Oracle Call Interface) | 底層 C API、性能最高、功能全 | 代碼冗長、手動資源管理 |
| ODBC | 通用、跨數據庫 | 性能一般、需配置 DSN |
| 第三方庫 | 簡化封裝、現代 C++ | 依賴第三方維護 |
OCCI 快速入門 (推薦)
1. 環境準備
- 下載 Oracle Instant Client 12.2+ (Basic + SDK)。
- 解壓至
D:\oracle\instantclient_12_2。
- VS2010 專案屬性:
- VC++ 目錄 → 包含目錄:添加
$(ORACLE_HOME)\sdk\include
- VC++ 目錄 → 庫目錄:添加
$(ORACLE_HOME)\sdk\lib\msvc
- 鏈接器 → 輸入 → 附加依賴項:
oraocci12.lib
- 系統環境變量
PATH 添加 $(ORACLE_HOME),TNS_ADMIN 指向 tnsnames.ora 目錄。
2. 完整代碼示例
#include <occi.h>
#include <iostream>
using namespace oracle::occi;
using namespace std;
int main() {
Environment *env = Environment::createEnvironment(Environment::DEFAULT);
Connection *conn = nullptr;
Statement *stmt = nullptr;
ResultSet *rs = nullptr;
try {
// 連接字符串:用戶/密碼@TNS服務名
conn = env->createConnection("scott", "tiger", "ORCL");
stmt = conn->createStatement("SELECT empno, ename, sal FROM emp WHERE deptno = :1");
stmt->setInt(1, 10);
rs = stmt->executeQuery();
while (rs->next()) {
cout << rs->getInt(1) << "\t"
<< rs->getString(2) << "\t"
<< rs->getDouble(3) << endl;
}
} catch (SQLException &ex) {
cerr << "Error: " << ex.getMessage() << endl;
} finally {
if (rs) stmt->closeResultSet(rs);
if (stmt) conn->terminateStatement(stmt);
if (conn) env->terminateConnection(conn);
Environment::terminateEnvironment(env);
}
return 0;
}
3. 關鍵點
- 資源管理:嚴格按逆序釋放
ResultSet → Statement → Connection → Environment。
- 參數綁定:使用
:1, :2 占位符防止注入。
- 異常處理:捕獲
SQLException。
- 編碼:確保客戶端
NLS_LANG 與數據庫一致(如 SIMPLIFIED CHINESE_CHINA.ZHS16GBK)。
參考資源