首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 動態建立 ODBC 系統 DSN:註冊表操作完整指南與多資料庫參數表

     編輯:Delphi

應用程式依賴 ODBC 系統 DSN 連線資料庫,但使用者可能誤刪或修改 DSN 導致程式失效。解決之道:程式啟動時檢查並自動在註冊表重建所需 DSN,確保環境永遠正確。本文詳細解析 ODBC 在註冊表的結構,提供完整重建代碼,並附上 Access、Excel、dBase、FoxPro 四大常見資料庫的完整參數對照表。

ODBC 註冊表結構速覽

路徑用途
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\\Engines\<引擎名>引擎進階參數(MaxBufferSize、PageTimeout、Threads 等)

建立 Access 97 DSN 完整代碼(Delphi 3 / Win98 驗證)

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;

四大資料庫 DSN 參數速查表

1. Microsoft Access (*.mdb)

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

2. Microsoft Excel (*.xls)

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

3. dBase (*.dbf)

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

4. FoxPro (*.dbf)

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

部署建議

  • 將上述邏輯封裝為 COM/ActiveX 元件,Delphi、C++Builder、VB、VC、PB 皆可呼叫。
  • 程式啟動時自動檢查/修復 DSN,或提供「修復連線」按鈕讓使用者一鍵恢復。
  • 注意 64 位系統註冊表重導向:32 位程式寫入 HKLM\Software\WOW6432Node\ODBC\...。

掌握註冊表操作,ODBC 環境部署不再是部署痛點,而是程式自帶的「自癒能力」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved