首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

MySQL C API 封裝類 CDatabase 實作與效能測試

     編輯:關於VC++

背景

MySQL 提供 ODBC 與原生 C API 兩種介面。C API 效能顯著優於 ODBC,但失去跨資料庫通用性。本文封裝 CDatabase 類別包裝 C API,支援連線、交易鎖表、CRUD、錯誤處理。

類別結構

class CDatabase {
public:
    CDatabase(); virtual ~CDatabase();
    BOOL ConnectDB(DBParam* p);        // 連線
    BOOL SelectDB(DataParam* p);       // 選擇資料庫
    BOOL InsertRecord(DataParam* p);   // 新增
    BOOL UpdateRecord(DataParam* p);   // 修改
    BOOL DeleteRecord(DataParam* p);   // 刪除
    BOOL SelectRecord(DataParam* p);   // 查詢單筆
    BOOL SelectAll(DataParam* p);      // 查詢全部
    MYSQL_ROW GetRecord();             // 取得下一筆
    my_ulonglong GetRowNum();          // 筆數
    unsigned int GetFieldNum();        // 欄位數
    char* GetFieldName(int idx);       // 欄位名
    BOOL LockTable(char* tbl, char* pri); // 鎖表
    BOOL UnLockTable();                // 解鎖
    int CreateDB(char* db); int DropDB(char* db);
    char* GetState(); char* GetServerInfo(); // 狀態資訊
    char* OutErrors();                 // 錯誤訊息
private:
    MYSQL mysql; MYSQL_RES* res; MYSQL_ROW row; MYSQL_FIELD* field;
    BOOL FindSave(char* sql);          // 內部執行查詢並緩存結果
};

核心函式實作

建構/解構

CDatabase::CDatabase() { mysql_init(&mysql); }
CDatabase::~CDatabase() { if(res) mysql_free_result(res); mysql_close(&mysql); }

連線

BOOL CDatabase::ConnectDB(DBParam* p) {
    if (!mysql_real_connect(&mysql, p->host, p->user, p->pass, p->db,
                            p->port, p->unix_socket, p->client_flag)) {
        OutErrors(); return FALSE;
    }
    return TRUE;
}

鎖表/解鎖(支援多執行緒/進程)

BOOL CDatabase::LockTable(char* tbl, char* pri) {
    char sql[50]; sprintf(sql, "LOCK TABLES %s %s", tbl, pri);
    return !mysql_query(&mysql, sql);
}
BOOL CDatabase::UnLockTable() {
    return !mysql_query(&mysql, "UNLOCK TABLES");
}

CRUD 範例

BOOL CDatabase::InsertRecord(DataParam* p) {
    char sql[80]; sprintf(sql, "INSERT INTO %s VALUES(%s)", p->table, p->values);
    return !mysql_query(&mysql, sql);
}
// Update/Delete/Select 同理,組合 SQL 字串呼叫 mysql_query

效能測試(Win98, C466/128MB)

操作ODBC APIC APIMS SQL (NT)
索引讀取 200 萬筆528 秒412 秒1634 秒
插入 35 萬筆750 秒435 秒4012 秒

C API 快約 1.3~2 倍於 ODBC,遠優於 MS SQL 同等測試。

編譯設定

  • 專案 → Settings → Link → Object/Library modules 加入 libmySQL.lib
  • 標頭檔 #include

結論

對效能敏感、功能需求不極複雜、預算有限的專案,MySQL + C API 是極佳選擇。

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