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

PowerBuilder 開發筆記:Access + ODBC 自動註冊與部署腳本完整解析

     編輯:關於SqlServer

應用場景

PowerBuilder (PB) 傳統桌面應用使用 **Microsoft Access (.mdb)** 做本地/共享資料庫,透過 **ODBC System DSN** 連線。部署至客戶端機器時,需自動檢測並註冊 ODBC 驅動程式與 DSN,避免手動設定「控制台 → 系統 DSN」。

核心邏輯流程

  1. 首次執行檢查: 讀取 `system.ini` (或登錄) 標記 `odbc_init`,若非首次則跳過。
  2. 驗證 Access 驅動程式是否安裝: 掃描登錄 `HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\ODBC DRIVERS` 下 `Microsoft Access Driver (*.mdb)` 是否為 `Installed`。
  3. 判斷作業系統類型與系統目錄: `Windows 9x` (System) vs `Windows NT/2000/XP+` (System32),定位 `odbcjt32.dll` 路徑。
  4. 註冊 ODBC 驅動程式 (ODBCINST.INI): 寫入驅動程式描述、DLL 路徑、Setup DLL、檔案擴展名等。
  5. 建立 System DSN (ODBC.INI): 寫入 DSN 名稱、驅動程式、資料庫檔案路徑 (DBQ)、UID/PWD 等屬性。
  6. 寫入完成標記,後續啟動直接連線。

關鍵 PB 代碼片段解析 (已補全截斷部分)

1. 環境變數與首次運行標記

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 表格),無需應用程式啟動時檢查 低 (調整建置腳本)

避坑指南

  • 權限問題: 寫入 `HKLM\SOFTWARE\ODBC\...` 需 **管理員權限**。Vista+ UAC 下 PB 應用若非以管理員身分執行,`RegistrySet` 會失敗。解決:安裝程式階段處理、或應用程式清單 `requireAdministrator`、或改寫 `HKCU` (User DSN,但需每用戶配置)。
  • 32/64 位元不匹配: PB Classic (12.6 及以前) 為 32 位元應用,**必須使用 32 位元 ODBC 驅動程式** (安裝 32-bit Access Database Engine),在 64 位元 OS 上對應 `SysWOW64\odbcad32.exe` 管理。PB .NET (12.5+) 可編譯 64 位元,需 64 位元驅動。
  • 登錄重導向: 32 位元應用在 64 位元 OS 寫入 `HKLM\Software` 實際寫入 `HKLM\Software\WOW6432Node`。ODBC 管理員 (64 位元) 讀取 `HKLM\Software`,**System DSN 將看不到**。解決:雙重寫入、或使用 `odbcconf.exe /A {CONFIGSYSDSN "Driver|DSN=...|DBQ=..."}` 命令列工具 (支援 32/64 位元切換 `/32` `/64`)。
  • Access 檔案路徑: `DBQ` 必須為**絕對路徑**,網路路徑需 UNC (`\\Server\Share\data.mdb`),且服務帳號需讀寫權限。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved