PowerBuilder (PB) 傳統桌面應用使用 **Microsoft Access (.mdb)** 做本地/共享資料庫,透過 **ODBC System DSN** 連線。部署至客戶端機器時,需自動檢測並註冊 ODBC 驅動程式與 DSN,避免手動設定「控制台 → 系統 DSN」。
string datafile, odbc_driver
int reg_result
integer odbc_init
ulong ul_n, ul_m
odbc_init = ProfileInt("system.ini", "start", "first", 1) // 1=首次
ul_n = 25 // 註冊項目計數估算
ul_m = 0
IF odbc_init = 1 THEN
// --- 驗證 Access Driver ---
string ls_sys, ls_install
ls_sys = "HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\ODBC DRIVERS"
RegistryGet(ls_sys, "Microsoft Access Driver (*.mdb)", RegString!, ls_install)
IF Trim(ls_install) <> "Installed" THEN
MessageBox("錯誤", "未安裝 Microsoft Access Driver (*.mdb)")
HALT
END IF
// --- 判斷系統目錄取得 odbcjt32.dll 路徑 ---
environment env
string startupfile
IF GetEnvironment(env) <> 1 THEN
MessageBox("錯誤", "無法取得環境資訊")
HALT
END IF
CHOOSE CASE env.OSType
CASE Windows! // Win 95/98/Me
CHOOSE CASE TRUE
CASE DirectoryExists("c:\Windows\System") : odbc_driver = "c:\Windows\System\odbcjt32.dll"
CASE DirectoryExists("d:\Windows\System") : odbc_driver = "d:\Windows\System\odbcjt32.dll"
CASE DirectoryExists("e:\Windows\System") : odbc_driver = "e:\Windows\System\odbcjt32.dll"
CASE DirectoryExists("f:\Windows\System") : odbc_driver = "f:\Windows\System\odbcjt32.dll"
CASE DirectoryExists("g:\Windows\System") : odbc_driver = "g:\Windows\System\odbcjt32.dll"
CASE ELSE
MessageBox("錯誤!", "找不到 Windows System 目錄,無法註冊 ODBC!")
HALT
END CHOOSE
CASE WindowsNT! // NT/2000/XP/2003/Vista/7/10/11...
CHOOSE CASE TRUE
CASE DirectoryExists("c:\WINNT\System32") : odbc_driver = "c:\WINNT\System32\odbcjt32.dll"
CASE DirectoryExists("d:\WINNT\System32") : odbc_driver = "d:\WINNT\System32\odbcjt32.dll"
CASE DirectoryExists("e:\WINNT\System32") : odbc_driver = "e:\WINNT\System32\odbcjt32.dll"
CASE DirectoryExists("f:\WINNT\System32") : odbc_driver = "f:\WINNT\System32\odbcjt32.dll"
CASE DirectoryExists("g:\WINNT\System32") : odbc_driver = "g:\WINNT\System32\odbcjt32.dll"
CASE ELSE
MessageBox("錯誤!", "找不到 WINNT System32 目錄,無法註冊 ODBC!")
HALT
END CHOOSE
END CHOOSE
// --- 註冊驅動程式到 ODBCINST.INI (系統層級) ---
// 使用 SQLConfigDriver / SQLInstallDriverEx API 或直接操作登錄
// 範例:RegistrySet 寫入 HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\Microsoft Access Driver (*.mdb)
// 需設定: Driver=odbcjt32.dll, Setup=odbcjt32.dll, FileUsage=1, FileExtns=*.mdb, ...
// --- 建立 System DSN 到 ODBC.INI ---
// 範例:RegistrySet 寫入 HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\MyAppDSN
// 需設定: Driver=..., DBQ=完整mdb路徑, UID=admin, PWD=, ...
// --- 寫入完成標記 ---
ProfileString("system.ini", "start", "first", "0") // 標記已完成
INIFileWrite("system.ini") // 確保寫入磁碟
END IF
| 方案 | 優點 | 遷移成本 |
|---|---|---|
| SQL Server Compact / LocalDB / SQLite | 無需 ODBC/驅動程式註冊,單一 DLL/檔案部署,支援 T-SQL/ADO.NET,效能優於 Access | 中 (需修改 DataWindow/Embedded SQL 語法) |
| PB Native OLE DB / ADO.NET 驅動直連 Access | 免 DSN,連接字串指定 `Provider=Microsoft.ACE.OLEDB.12.0;Data Source=...`,部署僅需安裝 ACE Runtime | 低 (修改 Transaction Object 連接參數) |
| InstallShield / Advanced Installer / WiX 打包安裝程式 | 安裝階段自動執行 ODBC 註冊 (標準 MSI ODBC 驅動程式/DSN 表格),無需應用程式啟動時檢查 | 低 (調整建置腳本) |