在部署資料庫應用程式時,若能於程式啟動時自動建立或更新 ODBC 系統資料源名稱(DSN),即可免去使用者手動設定的麻煩。本文以 Microsoft Access 為例,示範如何在 C++ Builder 中呼叫 ODBCCP32.DLL 匯出的 SQLConfigDataSource 函數,於 WinMain 階段動態註冊指向應用程式目錄下 test.mdb 的系統 DSN。
odbcinst.h(BCB/VC Include 目錄)odbccp32.dll(WinNT\System32)implib.exe、coff2omf.exe(BCB 工具).lib:
implib.exe odbccp32.lib odbccp32.dll
coff2omf odbccp32.lib
#include <vcl.h>
#include <odbcinst.h>
#pragma hdrstop
USEFORM("main.cpp", Form1);
// 其他單元...
USELIB("odbccp32.lib"); // 連結剛產生的 lib
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
// 組裝 ODBC 連接字串
AnsiString dataPath = GetCurrentDir();
AnsiString dbPath = dataPath + "\\test.mdb";
// 格式:DSN=名稱\0DBQ=路徑\0DefaultDir=目錄\0\0
// 先用 \b 佔位,稍後替換為 \0
AnsiString connStr = "DSN=test\bDBQ=" + dbPath + "\bDefaultDir=" + dataPath + "\b\b";
// 將 AnsiString 轉為字元陣列並替換 \b 為 \0
unsigned char temp[255];
char *ch = connStr.c_str();
int i = 0;
while (*ch != '\0')
{
if (*ch == '\b') *ch = '\0';
temp[i++] = *ch++;
}
// 呼叫 SQLConfigDataSource 建立/修改系統 DSN
if (::SQLConfigDataSource(NULL, ODBC_ADD_SYS_DSN,
(LPSTR)"Microsoft Access Driver (*.mdb)\0",
(LPSTR)temp))
{
Application->Title = "動態設定 ODBC 資料來源";
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
else
{
ShowMessage("資料庫設定失敗!");
Application->Termate();
}
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
\b 佔位再統一替換。"Microsoft Access Driver (*.mdb)" 需與系統 ODBC 驅動管理員顯示的名稱完全一致。ODBC_ADD_DSN。SQLConfigDataSource 回傳 FALSE,可呼叫 SQLInstallerError 取得詳細錯誤碼。若目標為 SQL Server、Oracle 等,僅需更換驅動名稱與連接字串關鍵字(如 SERVER、DATABASE、UID/PWD),其餘邏輯不變。
掌握此技巧,即可實現「綠色部署」:使用者只需執行 EXE,資料來源自動就緒,大幅降低安裝門檻。