應用程式依賴 ODBC 系統 DSN 連線資料庫,但使用者可能誤刪或修改 DSN 導致程式失效。解決之道:程式啟動時檢查並自動在註冊表重建所需 DSN,確保環境永遠正確。本文詳細解析 ODBC 在註冊表的結構,提供完整重建代碼,並附上 Access、Excel、dBase、FoxPro 四大常見資料庫的完整參數對照表。
| 路徑 | 用途 |
|---|---|
HKLM\Software\ODBC\ODBCInst.INI\ODBC Drivers | 已安裝驅動程式清單,Key=驅動名,Value="Installed" |
HKLM\Software\ODBC\ODBCInst.INI\<驅動名> | 驅動詳細資訊,Driver 值為 DLL 路徑 |
HKLM\Software\ODBC\ODBC.INI\ODBC Data Sources | 系統 DSN 索引,Key=DSN名,Value=驅動名 |
HKLM\Software\ODBC\ODBC.INI\ | DSN 核心設定(DBQ、Description、Driver、DriverID、UID 等) |
HKLM\Software\ODBC\ODBC.INI\ | 引擎進階參數(MaxBufferSize、PageTimeout、Threads 等) |
uses Registry;
procedure TForm1.Button1Click(Sender: TObject);
var Reg: TRegistry; B: array[0..0] of Byte;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
// 1. 註冊 DSN 名稱
if Reg.OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources', True) then
Reg.WriteString('MyAccess', 'Microsoft Access Driver (*.mdb)')
else begin Memo1.Lines.Add('失敗'); Exit; end;
Reg.CloseKey;
// 2. DSN 核心設定
if Reg.OpenKey('Software\ODBC\ODBC.INI\MyAccess', True) then begin
Reg.WriteString('DBQ', 'C:\Inetpub\wwwroot\Test.mdb');
Reg.WriteString('Description', '我的新資料源');
Reg.WriteString('Driver', 'C:\Windows\System\odbcjt32.dll');
Reg.WriteInteger('DriverID', 25);
Reg.WriteString('FIL', 'MS Access;');
Reg.WriteInteger('SafeTransaction', 0);
Reg.WriteString('UID', '');
B[0] := 0;
Reg.WriteBinaryData('Exclusive', B, 1);
Reg.WriteBinaryData('ReadOnly', B, 1);
end else begin Memo1.Lines.Add('失敗'); Exit; end;
Reg.CloseKey;
// 3. Jet 引擎參數
if Reg.OpenKey('Software\ODBC\ODBC.INI\MyAccess\Engines\Jet', True) then begin
Reg.WriteString('ImplicitCommitSync', 'Yes');
Reg.WriteInteger('MaxBufferSize', 512);
Reg.WriteInteger('PageTimeout', 5);
Reg.WriteInteger('Threads', 3);
Reg.WriteString('UserCommitSync', 'Yes');
end else begin Memo1.Lines.Add('失敗'); Exit; end;
Reg.CloseKey;
Memo1.Lines.Add('建立 DSN 成功');
finally
Reg.Free;
end;
end;
DBQ, Description, Driver=odbcjt32.dll, DriverID=25, FIL=MS Access;,
SafeTransaction=0, UID='', Exclusive=0, ReadOnly=0, PWD='',
Engines\Jet: ImplicitCommitSync=Yes, MaxBufferSize=512, PageTimeout=5,
Threads=3, UserCommitSync=Yes
可選:SystemDb, ReadOnly, Exclusive, PWD
DBQ(Excel97/5.0/7.0=檔案路徑, 3.0/4.0=目錄),
Description, Driver=odbcjt32.dll,
DefaultDir(97/5.0/7.0=DBQ目錄, 3.0/4.0=同DBQ),
DriverID: 97=790, 5.0/7.0=22, 4.0=278, 3.0=534,
FIL=Excel 5.0;, ReadOnly, SafeTransaction, UID,
Engines\Excel: ImplicitCommitSync, MaxScanRows=8, Threads,
UserCommitSync, FirstRowHasNames=1
DefaultDir=目錄, Description, Driver=odbcjt32.dll,
DriverID: IV=277, 5.0=533, FIL=dBase III;, SafeTransaction, UID,
Engines\Xbase: ImplicitCommitSync, Collating=ASCII/International/...,
Deleted=1, PageTimeout=600, UserCommitSync, Threads, Statistics=0
DefaultDir=目錄, Description, Driver=odbcjt32.dll,
DriverID: 2.6=536, 2.5=280, FIL=FoxPro 2.0;, SafeTransaction, UID,
Engines\Xbase: Collating=ASCII/International, Deleted=1,
PageTimeout=600, UserCommitSync, Threads, Statistics=0
HKLM\Software\WOW6432Node\ODBC\...。掌握註冊表操作,ODBC 環境部署不再是部署痛點,而是程式自帶的「自癒能力」。