在客戶端程式一、二中,連線與斷線代碼直接寫在 main() 裡,導致每個新程式都得複製貼上,修改錯誤或改進功能時更得逐一更新。客戶端程式三(client3)採用模組化封裝策略:將通用的連線/斷線邏輯提取到獨立的 common.c 與 common.h,供多個程式共享。好處顯而易見:
mysql_real_connect() 參數不同)提供統一適配層。do_connect() 與 do_disconnect()do_connect() 封裝了 mysql_init()、mysql_real_connect() 及錯誤處理,參數與 mysql_real_connect() 幾乎相同(不需傳連線控制代碼),成功回傳 MYSQL*,失敗列印錯誤並回傳 NULL。do_disconnect() 則單純呼叫 mysql_close(),但預留了未來擴充清理邏輯的彈性。
print_error()原始代碼中到處散落 fprintf(stderr, ...)、mysql_errno()、mysql_error(),閱讀困難且格式不一。引入 print_error(conn, "context") 統一錯誤輸出,優勢:
conn 為 NULL(如 mysql_init() 失敗)也能妥善處理。利用 MYSQL_VERSION_ID 巨集,do_connect() 可在編譯時自動適配舊版 mysql_real_connect()(無 db_name 參數):若偵測到舊版,改呼叫 mysql_select_db() 切換資料庫,失敗則關閉連線回傳 NULL。這讓所有使用 do_connect() 的程式自動獲得跨版本支援,無需各自修改。
client3.c 的簡化引入 common.h 後,main() 僅剩核心邏輯:
MYSQL *conn = do_connect(host, user, pass, db, port, sock, flag);
if (!conn) exit(1);
/* 業務操作... */
do_disconnect(conn);
連線細節完全隱藏,專注於資料庫操作本身。