使用 **dbExpress** 四層架構連接 MySQL:
UI 控件 (DBGrid, DBNavigator)
↓
DataSource (TDataSource)
↓
ClientDataSet (TClientDataSet) ← 內存數據緩存、支持離線編輯
↓
DataSetProvider (TDataSetProvider) ← 適配器,橋接雙向數據流
↓
SQLTable / SQLQuery (TSQLTable/TSQLQuery) ← 一向游標、只讀/可更新
↓
SQLConnection (TSQLConnection) ← dbExpress 驅動層
↓
MySQL 客戶端庫 (libmysql.dll) + dbExpress 驅動
ConnectionName = 'MYSQLCONNECTION'
DriverName = 'MySQL'
GetDriverFunc = 'getSQLDriverMYSQL'
LibraryName = 'dbxmys.dll' -- dbExpress MySQL 驅動
VendorLib = 'libmysql.dll' -- MySQL 官方客戶端庫
LoginPrompt = False
Params.Values['HostName'] = 'localhost'
Params.Values['Database'] = 'mysqldb'
Params.Values['User_Name'] = 'root'
Params.Values['Password'] = 'pswd'
Params.Values['MaxBlobSize'] = '-1'
Params.Values['ServerCharSet'] = 'utf8'
Connected = True
Active = True
ProviderName = 'DataSetProvider1'
-- 重要事件:
-- OnReconcileError: 衝突解決 (ApplyUpdates 失敗時)
-- BeforePost: 客戶端驗證
procedure TForm1.Button1Click(Sender: TObject);
begin
// 將 ClientDataSet 內存修改批量應用到數據庫
ClientDataSet1.ApplyUpdates(0); // 0 = 無限重試
end;
放置於應用程序同目錄或系統 PATH 目錄下。
| 現象 | 原因 | 解決 |
|---|---|---|
| Cannot load libmysql.dll | 缺少 DLL 或版本不匹配 (32/64 位不一致) | 確認編譯目標平台與 DLL 位數一致;用 Dependency Walker 檢查依賴 |
| 連接超時 | 防火牆、skip-name-resolve、bind-address | MySQL 配置 `bind-address=0.0.0.0`;客戶端用 IP 直連 |
| 中文亂碼 | 字符集不一致 | 連接參數 `ServerCharSet=utf8` / `utf8mb4`;表/列字符集一致 |
| ApplyUpdates 失敗 | 主鍵缺失、觸發器、並發衝突 | 表必須有主鍵;OnReconcileError 處理衝突 |