MySQL 作為高效能網路資料庫,在 Web 架構中表現優異,但在傳統應用軟體開發中較少採用。本文深入探討 MySQL 提供的兩種介面——ODBC API 與 C API 在 Visual C++ 6.0 中的實作細節,並示範如何封裝 CDatabase 類別以統一管理 C API 功能,提升開發效率與程式碼可維護性。
ODBC 透過驅動程式屏蔽資料庫差異,提升程式通用性。MySQL 官方提供 myodbc-2.50.31-win95 驅動。設定資料來源 (DSN) 後,即可使用標準 ODBC 程式設計流程操作 MySQL。

圖 1:ODBC 資料來源設定資訊
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()。
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); // 查詢並保存結果集
};
建構函式: 初始化 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。
| 操作 | ODBC API | C API | MS SQL Server (NT) |
|---|---|---|---|
| 索引讀取 200 萬筆 | 528 秒 | 412 秒 | 1634 秒 |
| 插入 35 萬筆 | 750 秒 | 435 秒 | 4012 秒 |
註:數值為多次測量平均,僅供參考。C API 效能顯著優於 ODBC,且遠超 MS SQL Server。
MySQL 雖功能不及商用旗艦資料庫完整,但免費、高速、輕量,滿足大多數應用軟體需求。若專案對效能要求高、功能靈活度要求中等、預算有限,MySQL 是最佳選擇。配合 CDatabase 封裝 C API,可進一步簡化開發並發揮極致效能。