在使用 C++ Builder 開發資料庫應用程式時,透過 BDE(Borland Database Engine)別名連接資料庫雖然方便,但面對路徑不固定或部署環境未知的資料庫,預先建立別名往往力有未逮。這時候,在程式執行期動態建立 BDE 別名便成為剛需。本文將以一個位於程式目錄下的 Paradox 資料表 friends.db 為例,示範如何在運行時初始化 BDE、建立臨時別名、並透過 TQuery 存取資料。
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
if (Query1->State == dsInactive)
{
// 1. 初始化 BDE
DbiInit(NULL);
// 2. 開啟一個臨時 Session
hDBISession tmpSession;
DbiStartSession(NULL, &tmpSession, "");
// 3. 組裝別名路徑(指向應用程式所在目錄)
// 注意:路徑字串前綴必須加上 "PATH:"
AnsiString strPath = "PATH:" + ExtractFileDir(Application->ExeName);
// 4. 新增別名:名稱 tmpmyfriends,驅動類型 PARADOX,不持久化
DbiAddAlias(NULL, "tmpmyfriends", "PARADOX", strPath.c_str(), false);
// 5. 設定 Query 的 DatabaseName 並啟用
Query1->DatabaseName = "tmpmyfriends";
Query1->Active = true;
}
// 執行查詢
Query1->SQL->Clear();
Query1->SQL->Add("SELECT * FROM friends.db");
Query1->Open();
}
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
if (Query1->Active)
Query1->Active = false;
DbiCloseSession(tmpSession); // 關閉 Session
DbiExit(); // 釋放 BDE 資源
}
語法:DBIResult DBIFN DbiStartSession(pszName, phSession, pNetDir)
NULL 讓 BDE 自動命名。NULL。DBIERR_NONE。語法:DBIResult DbiAddAlias(hCfg, pszAliasName, pszDriverType, pszParams, bPersistent)
NULL 表示寫入目前 Session。"tmpmyfriends")。"PARADOX",Standard 型傳 NULL。"PATH:實際目錄路徑"。true 寫入系統組態檔(永久),false 僅存在於目前 Session(臨時)。DBIERR_NONE。private 區塊宣告 hDBISession tmpSession; 以便在 FormClose 中釋放。DbiAddAlias 的參數字串必須以 "PATH:" 開頭,否則別名無效。TQuery,再 DbiCloseSession,最後 DbiExit,避免資源洩漏。掌握此技巧,即可讓應用程式在任何目錄下「開箱即用」,免去安裝時手動設定 ODBC/BDE 別名的麻煩,極大提升部署彈性。