OTL (Oracle, ODBC and DB2-CLI Template Library) 是單一頭文件 otlv4.h 的跨平台 C++ 資料庫存取庫,支援 MySQL、Oracle、PostgreSQL、SQLite 等主流資料庫。本文以 ODBC 連接 MySQL 為例,展示完整的建表、增刪改查與錯誤處理流程。
MySQL Connector/ODBC)。mysql,指向目標資料庫。otlv4.h 放入專案包含路徑。#define OTL_ODBC_MYSQL // 指定連接 ODBC MySQL
#include <otlv4.h> // 單一頭文件
otl_connect db; // 資料庫連接物件
void insert() {
otl_stream o(1,
"INSERT INTO test_tab VALUES(:f1<int>, :f2<char[31]>)", db);
char tmp[32];
for (int i = 1; i <= 100; ++i) {
sprintf(tmp, "Name%d", i);
o << i << tmp;
}
}
void update(int af1) {
otl_stream o(1,
"UPDATE test_tab SET f2=:f2<char[31]> WHERE f1=:f1<int>", db);
o << "Name changed" << af1;
o << otl_null() << af1 + 1; // 將 f2 設為 NULL
}
void select(int af1) {
char stmbuf[1024];
// MyODBC 不支援 SELECT WHERE 綁定變數,需動態拼 SQL
sprintf(stmbuf, "SELECT * FROM test_tab WHERE f1>=%d AND f1<=%d*2", af1, af1);
otl_stream i(50, stmbuf, db);
int f1; char f2[31];
while (!i.eof()) {
i >> f1;
cout << "f1=" << f1 << ", f2=";
i >> f2;
if (i.is_null()) cout << "NULL"; else cout << f2;
cout << endl;
}
}
int main() {
otl_connect::otl_initialize(); // 初始化 ODBC 環境
try {
db.rlogon("UID=scott;PWD=tiger;DSN=mysql"); // 連接 DSN
otl_cursor::direct_exec(db, "DROP TABLE test_tab", otl_exception::disabled);
otl_cursor::direct_exec(db, "CREATE TABLE test_tab(f1 INT, f2 VARCHAR(30))");
insert();
update(10);
select(8);
} catch (otl_exception& p) {
cerr << p.msg << endl; // 錯誤訊息
cerr << p.stm_text << endl; // 導致錯誤的 SQL
cerr << p.sqlstate << endl; // SQLSTATE
cerr << p.var_info << endl; // 相關變數資訊
}
db.logoff(); // 斷開連接
return 0;
}
OTL_ODBC_MYSQL 告訴 OTL 使用 ODBC API 連接 MySQL;若直連 MySQL 原生協議可用 OTL_MYSQL(需 MySQL C API)。
INSERT/UPDATE:緩衝區必須為 1,確保即時送出。SELECT:可設 >1(如 50)提升批次讀取效能。:f1<int>、:f2<char[31]> 依序對應 operator<< 傳入的 C++ 變數,類型安全且防 SQL 注入。
MyODBC 不支援 WHERE 子句綁定變數,故示例採 sprintf 動態生成完整 SQL 再傳給 otl_stream。
捕獲 otl_exception 可取得完整錯誤上下文,包含 SQL 文本、SQLSTATE、問題變數,極大簡化除錯。
g++ -std=c++11 -I/path/to/otl main.cpp -lodbc -o demo
./demo
輸出示例:
f1=8, f2=Name8
f1=9, f2=Name9
f1=10, f2=Name changed
f1=11, f2=NULL
f1=12, f2=Name12
...
OTL 以單一頭文件、零依賴、模板化設計,極適合嵌入式或輕量級 C++ 專案快速整合資料庫存取。