首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

C++ OTL 庫連接 MySQL ODBC 實作:Insert/Update/Select 完整範例

     編輯:MySQL 綜合教學

C++ OTL 庫連接 MySQL ODBC 實作:Insert/Update/Select 完整範例

OTL (Oracle, ODBC and DB2-CLI Template Library) 是單一頭文件 otlv4.h 的跨平台 C++ 資料庫存取庫,支援 MySQL、Oracle、PostgreSQL、SQLite 等主流資料庫。本文以 ODBC 連接 MySQL 為例,展示完整的建表、增刪改查與錯誤處理流程。

環境準備

  1. 安裝 MySQL ODBC Driver(MySQL Connector/ODBC)。
  2. 系統 DSN 設定:名稱 mysql,指向目標資料庫。
  3. 下載 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;
}

關鍵技術點解析

1. 宏定義決定驅動類型

OTL_ODBC_MYSQL 告訴 OTL 使用 ODBC API 連接 MySQL;若直連 MySQL 原生協議可用 OTL_MYSQL(需 MySQL C API)。

2. otl_stream 緩衝區大小

  • INSERT/UPDATE:緩衝區必須為 1,確保即時送出。
  • SELECT:可設 >1(如 50)提升批次讀取效能。

3. 佔位符語法

:f1<int>、:f2<char[31]> 依序對應 operator<< 傳入的 C++ 變數,類型安全且防 SQL 注入。

4. MyODBC 的 SELECT 綁定變數限制

MyODBC 不支援 WHERE 子句綁定變數,故示例採 sprintf 動態生成完整 SQL 再傳給 otl_stream。

5. 例外處理

捕獲 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++ 專案快速整合資料庫存取。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved