Access (`.mdb`/`.accdb`) 以檔案型、零配置、易部署特性,廣泛用於中小型桌面應用。C++Builder (VCL) 提供 **設計期拖拉元件** 與 **執行期動態建立** 兩種模式,本文以 `student.mdb` 為例完整示範兩條路徑。
C++Builder 早期透過 **BDE (Borland Database Engine)** 存取 Access,需先在「Database Desktop」→「Alias Manager」建立別名:
關鍵設定:BDE Administrator → `MSACCESS` 驅動 → `DLL32` 改為 `IDDA3532.DLL` (支援 Access 97/2000 格式),否則執行期無法開啟。
TDatabase (Database1)
→ AliasName = "mydatabase"
→ DatabaseName = "app_alias" // 應用程式私有別名,免衝突
→ Connected = true (登入對話框按確定)
TTable (Table1)
→ DatabaseName = "app_alias"
→ TableName = "Students" // 下拉選擇資料表
→ Active = true
TDataSource (DataSource1)
→ DataSet = Table1
TDBGrid (DBGrid1) + TDBNavigator (DBNavigator1)
→ DataSource = DataSource1
表單加入 `TSession (Session1)`,`AutoSessionName = true` (避免多執行個體衝突)。
void __fastcall TForm1::FormCreate(TObject *Sender)
{
AnsiString appPath = ExtractFilePath(ParamStr(0)); // 程式所在目錄
AnsiString aliasName = "mydatabase2"; // 執行期動態別名
AnsiString dbParam = "DATABASE NAME=" + appPath + "123.mdb";
// 1. 別名不存在則建立
if (!Session1->IsAlias(aliasName)) {
TStringList* lst = new TStringList();
lst->Add(dbParam);
Session1->AddAlias(aliasName, "MSACCESS", lst);
delete lst;
Session1->Close(); // 刷新會話
}
// 2. 串聯元件
Database1->AliasName = aliasName;
Database1->DatabaseName = "app_alias";
Table1->DatabaseName = Database1->DatabaseName;
Table1->TableName = "xxys"; // 目標資料表
Table1->Active = true; // 開啟查詢
}
void __fastcall TForm1::Database1Login(TDatabase *Sender, TStrings *LoginParams)
{
LoginParams->Values["USERNAME"] = "";
LoginParams->Values["PASSWORD"] = "";
}
| 方案 | 特點 | 遷移成本 |
|---|---|---|
| ADO (TADOConnection/TADOQuery) | Windows 內建、無額外引擎、支援 .accdb、參數化查詢完善 | 低 (VCL 元件對應關係清晰) |
| FireDAC (TFDConnection/TFDQuery) | RAD Studio 專業版內建、高效能、跨平台、支援 SQLite/PostgreSQL 等 | 中 (API 風格不同,但功能更強) |
| SQLite + 獨立 DLL | 零配置、單一檔案、公共領域、極輕量 | 中 (需重寫 SQL 方言差異) |
建議:新專案直接用 **FireDAC + SQLite** 或 **FireDAC + Access (ACE OLEDB)**;維護舊 BDE 專案時,上述雙軌做法仍能穩定運行。
| 現象 | 原因 | 解決 |
|---|---|---|
| "Unknown database alias" | 別名未建立/拼寫錯誤 | 執行期 `IsAlias` 檢查 + `AddAlias` 建立 |
| "Could not find installable ISAM" | BDE `DLL32` 指向舊版 `IDDAO32.DLL` | 改為 `IDDA3532.DLL` 並重啟 IDE |
| 中文欄位/資料亂碼 | ANSI/Unicode 不匹配 | Access 2000+ 用 Unicode,BDE 需設 `LANGDRIVER=DBWINUS` 或改用 ADO/FireDAC |
| 多執行緒存取衝突 | BDE 非執行緒安全 | 單執行緒序列化存取,或遷移 FireDAC (支援連線池) |
C++Builder 存取 Access 核心在於 **別名管理** 與 **元件串聯**。設計期適合快速原型,執行期適合正式部署。掌握 `TSession.AddAlias` 動態建立別名技巧,即可實現「綠色軟體」式零安裝部署。長期視角下,儘早遷移至 **FireDAC + SQLite/ACE** 才是可持續之路。