首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

VC 環境下 MySQL 資料庫介面實作與 CDatabase 類封裝

     編輯:MySQL 資料庫相關知識

MySQL 作為高效能網路資料庫,在 Web 架構中表現優異,但在傳統應用軟體開發中較少採用。本文深入探討 MySQL 提供的兩種介面——ODBC API 與 C API 在 Visual C++ 6.0 中的實作細節,並示範如何封裝 CDatabase 類別以統一管理 C API 功能,提升開發效率與程式碼可維護性。

測試環境

  • 硬體:Celeron 466 / 128MB RAM / 15GB 硬碟
  • 軟體:Visual C++ 6.0、MySQL 3.23.22-beta for Win32、Windows 98

MySQL 核心特性回顧

  • 真正的多用戶、多執行緒 SQL 伺服器
  • 支援 C/C++、Java (JDBC)、Perl、Python、PHP、TCL 等 API
  • 跨平台:Solaris、Linux、FreeBSD、Windows 9x/NT 等
  • 豐富資料型別:整數、浮點數、CHAR、VARCHAR、TEXT、BLOB、DATE、DATETIME、ENUM、SET 等
  • 靈活權限系統、密碼加密、Windows ODBC 支援
  • MyISAM 引擎支援 800 萬 TB 級大表 (263 bytes)
  • 犧牲子查詢、預存程序、觸發器、外鍵、事務等進階功能,換取 2-3 倍處理速度優勢

2. ODBC API 實作

ODBC 透過驅動程式屏蔽資料庫差異,提升程式通用性。MySQL 官方提供 myodbc-2.50.31-win95 驅動。設定資料來源 (DSN) 後,即可使用標準 ODBC 程式設計流程操作 MySQL。

ODBC 資料來源設定

圖 1:ODBC 資料來源設定資訊

3. C API 直接操作與 CDatabase 類別封裝

C API 直接與 MySQL 伺服器通訊,效能顯著優於 ODBC,但犧牲跨資料庫通用性。核心資料型別包括 MYSQL (連線控制代碼)、MYSQL_RES (結果集)、MYSQL_ROW (資料列)、MYSQL_FIELD (欄位資訊) 等;關鍵函數有 mysql_init()、mysql_real_connect()、mysql_query()、mysql_store_result()、mysql_free_result()、mysql_close()。

3.1 CDatabase 類別結構

class CDatabase {
public:
    BOOL UnLockTable();                    // 解鎖
    BOOL LockTable(char* TableName,char* PRIORITY); // 加鎖
    int Reload();                          // 重新登入
    char* GetState();                      // 伺服器狀態
    char* GetServerInfo();                 // 伺服器資訊
    int GetProtocolInfo();                 // 協定資訊
    char* GetHostInfo();                   // 主機資訊
    char* GetClientInfo();                 // 客戶端資訊
    char* GetFieldName(int FieldNum);      // 取得欄位名
    BOOL IsEnd();                          // 是否到達末尾
    int DropDB(char *db);                  // 刪除資料庫
    void SeekData(int offset);             // 定位資料
    int CreateDB(char *db);                // 建立資料庫
    void FreeRecord();                     // 釋放結果集
    unsigned int GetFieldNum();            // 取得欄位數
    BOOL ConnectDB(Database_Param *p);     // 連線資料庫
    MYSQL_ROW GetRecord();                 // 取得一筆記錄
    my_ulonglong GetRowNum();              // 取得記錄數
    BOOL SelectDB(Data_Param *para);       // 選擇資料庫
    BOOL UpdateRecord(Data_Param *para);   // 更新記錄
    BOOL SelectRecord(Data_Param *para);   // 查詢記錄
    BOOL InsertRecord(Data_Param *para);   // 插入記錄
    BOOL DelRecord(Data_Param *para);      // 刪除記錄
    BOOL SelectAll(Data_Param *para);      // 查詢所有
    char * OutErrors();                    // 輸出錯誤
    CDatabase();                           // 建構函式
    virtual ~CDatabase();                  // 解構函式
private:
    MYSQL mysql;                           // 連線控制代碼
    MYSQL_RES *query;                      // 結果集
    MYSQL_ROW row;                         // 資料列
    MYSQL_FIELD *field;                    // 欄位資訊
    BOOL FindSave(char *str);              // 查詢並保存結果集
};

3.2 關鍵函數實作範例

建構函式: 初始化 MYSQL 結構

CDatabase::CDatabase() { mysql_init(&mysql); }

連線函式: 使用 mysql_real_connect

BOOL CDatabase::ConnectDB(Database_Param *p) {
    if(!mysql_real_connect(&mysql, p->host, p->user, p->password,
                           p->db, p->port, p->unix_socket, p->client_flag)) {
        OutErrors(); return false;
    }
    return true;
}

加鎖/解鎖: 支援多執行緒並發存取

BOOL CDatabase::LockTable(char* TableName, char* PRIORITY) {
    char str[50];
    sprintf(str, "LOCK TABLES %s %s", TableName, PRIORITY);
    return mysql_query(&mysql, str) == 0;
}
BOOL CDatabase::UnLockTable() {
    return mysql_query(&mysql, "UNLOCK TABLES") == 0;
}

插入記錄:

BOOL CDatabase::InsertRecord(Data_Param *para) {
    char str[80];
    sprintf(str, "insert into %s values(%s)", para->tab_name, para->insert_val);
    return mysql_query(&mysql, str) == 0;
}

解構函式: 釋放結果集並關閉連線

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

編譯提醒: 必須連結 libmySQL.lib。

4. 效能測試對比

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

註:數值為多次測量平均,僅供參考。C API 效能顯著優於 ODBC,且遠超 MS SQL Server。

5. 結論

MySQL 雖功能不及商用旗艦資料庫完整,但免費、高速、輕量,滿足大多數應用軟體需求。若專案對效能要求高、功能靈活度要求中等、預算有限,MySQL 是最佳選擇。配合 CDatabase 封裝 C API,可進一步簡化開發並發揮極致效能。

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