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");
}
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
| 操作 | ODBC API | C API | MS SQL (NT) |
|---|---|---|---|
| 索引讀取 200 萬筆 | 528 秒 | 412 秒 | 1634 秒 |
| 插入 35 萬筆 | 750 秒 | 435 秒 | 4012 秒 |
C API 快約 1.3~2 倍於 ODBC,遠優於 MS SQL 同等測試。
libmySQL.lib#include 對效能敏感、功能需求不極複雜、預算有限的專案,MySQL + C API 是極佳選擇。