首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++Builder 存取 Access 資料庫:設計期與執行期雙軌實戰

     編輯:關於C++

引言

Access (`.mdb`/`.accdb`) 以檔案型、零配置、易部署特性,廣泛用於中小型桌面應用。C++Builder (VCL) 提供 **設計期拖拉元件** 與 **執行期動態建立** 兩種模式,本文以 `student.mdb` 為例完整示範兩條路徑。

共同前置:建立 BDE 別名

C++Builder 早期透過 **BDE (Borland Database Engine)** 存取 Access,需先在「Database Desktop」→「Alias Manager」建立別名:

  1. 新增 → 別名:`mydatabase`,驅動類型:`MSACCESS`。
  2. DATABASE NAME:填入 `.mdb` 完整路徑 (如 `C:\Project\student.mdb`)。
  3. 儲存 → 系統登錄寫入別名定義。

關鍵設定: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` (避免多執行個體衝突)。

FormCreate 完整代碼

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"] = "";
}

優缺點

  • ✅ 完全自主:`.mdb` 與 `.exe` 同目錄即可攜帶部署,無需目標機預設別名。
  • ✅ 可動態切換資料庫檔 (多帳套、備份還原)。
  • ❌ 代碼量稍多,需理解 BDE 會話/別名機制。

現代化遷移建議 (BDE 已淘汰)

方案特點遷移成本
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** 才是可持續之路。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved