近期專案將資料庫管理系統從 SQL Server 2000 遷移至 MySQL。原先採用 ADO 連接 SQL Server,遷移後為了快速搭建原型,決定直接基於 MySQL C API 進行面向對象封裝,實現資料庫建立、資料表建立、讀寫操作等核心功能。目前暫未引入連接池與事務處理模組,但基礎架構已穩定運行。
由 Sun Microsystems 開發,實現 JDBC 4.0 規範的 C++ 版本。介面設計參考 Java JDBC API,熟悉 JDBC 的開發者可無縫遷移,開發效率高。提供標準化的面向對象編程介面與資料庫驅動。
建立在 C++ 標準模板庫 (STL) 之上,將資料庫操作封裝為類似 STL 容器的操作體驗。提供原生 C++ 介面,減少重複性工作,適合偏好標準庫風格的開發者。
專案初期為追求快速原型驗證,未採用上述成熟庫,而是直接封裝 MySQL C API。以下是核心類 MySQLInterface 的設計與實現要點:
#ifndef __MYSQL_INTERFACE_H__
#define __MYSQL_INTERFACE_H__
#include <winsock2.h>
#include <iostream>
#include <string>
#include <vector>
#include "mysql.h"
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "libmysql.lib")
using namespace std;
class MySQLInterface {
public:
MySQLInterface();
virtual ~MySQLInterface();
// 連接資料庫
bool connectMySQL(char* server, char* username, char* password, char* database, int port);
// 建立資料庫(不存在則建立並切換)
bool createDatabase(std::string& dbname);
// 執行建表 SQL
bool createdbTable(const std::string& query);
// 寫入資料(INSERT/UPDATE/DELETE)
bool writeDataToDB(string queryStr);
// 查詢資料,結果存入二維向量
bool getDatafromDB(string queryStr, std::vector<std::vector<std::string> >& data);
// 關閉連接
void closeMySQL();
// 獲取最後錯誤
void errorIntoMySQL();
public:
int errorNum; // 錯誤代碼
const char* errorInfo; // 錯誤訊息
private:
MYSQL mysqlInstance; // MySQL 連接實例
MYSQL_RES *result; // 結果集指標
};
#endif
mysql_library_init、mysql_init,並設定字符集為 GBK(mysql_options(&mysqlInstance, MYSQL_SET_CHARSET_NAME, "gbk"))。mysql_real_connect 建立連接,失敗時自動記錄錯誤碼與訊息。CREATE DATABASE IF NOT EXISTS 與 USE db 邏輯;建表直接執行傳入的 DDL 語句。mysql_query 執行 DML,失敗記錄錯誤。mysql_store_result 獲取完整結果集,逐行 (mysql_fetch_row) 解析欄位,處理 NULL 值轉為空字串,最終存入 vector<vector<string>> 便於上層業務處理。mysql_errno 與 mysql_error 獲取錯誤資訊,供外部檢查。mysql_close 關閉連接。MySQLInterface db;
if (db.connectMySQL("localhost", "root", "password", "testdb", 3306)) {
db.createDatabase("testdb");
db.createdbTable("CREATE TABLE IF NOT EXISTS users (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50))");
db.writeDataToDB("INSERT INTO users (name) VALUES ('Alice')");
std::vector<std::vector<std::string>> data;
db.getDatafromDB("SELECT * FROM users", data);
// 處理 data...
db.closeMySQL();
}
這套輕量封裝滿足了專案快速遷移與原型驗證的需求,代碼結構清晰,易於維護與擴展。若專案規模增長,建議平滑遷移至 MySQL Connector/C++ 或 MySQL++ 等成熟庫,獲得更完善的企業級特性。