如何在DELPHI程序中動態設置ODBC數據源
ODBC數據庫驅動程序設置DSN的秘密在注冊表中,所以要想動態地設置ODBC數據源,我們首先就要從注冊表開始。打開注冊表,到HKEY_LOCAL_MACHINE\Software\ODBC看一看它的設置。首先來看看系統中已安裝的ODBC數據庫驅動程序.在HKEY_LOCAL_MACHINE\Software\ODBC\ODBCInst.INI中,存放著已經安裝了的ODBC數據庫驅動程序的信息,從這里可以查到已安裝的ODBC數據庫驅動程序對應的DLL文件等信息.在ODBCInst.INI\ODBC Drivers的各個鍵值中,鍵名是驅動程序名稱(如Microsoft Access Driver(*.mdb)),鍵值為“Installed”,表示驅動程序已安裝。
在ODBCInst.INI\DriverName(DriverName為一個驅動程序名稱,如Microsoft Access Driver(*.mdb))中,有驅動程序的詳細信息,我們主要從這里獲得ODBC驅動程序對應的DLL文件的路徑和文件名,即鍵名Driver的鍵值,一般為"C:\WINDOWS\SYSTEM\FileName.DLL".然后來看系統DSN的注冊信息,在HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI中,存放著系統DSN的注冊信息,我們在ODBC管理面板設置的DSN參數就在這里。
下面來看看創建一個ODBC系統DSN的步驟,即我們在ODBC管理面板中完成參數設置后,ODBC管理程序是怎么在注冊表中注冊DSN信息的.以創建一個名稱為MyAccess的Ms Access97類型的系統DSN為例,我們指定的參數主要有數據庫類型(Microsoft Access Driver(*.mdb))、數據源名稱(MyAccess)、數據源描述(我的ACCESS)、數據庫路徑(C:\Inetpub\wwwroot\Test.mdb),其它參數如用戶名稱、用戶密碼、獨占、只讀、系統數據庫、默認目錄、緩沖區大小、掃描行數、頁超時等采用系統缺省參數.這時,注冊系統DSN一般應有以下幾個步驟:
1.在HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\ODBC Data Sources中增加一個字符串鍵值,為MyAccess = Microsoft Access Driver(*.mdb),其中分別為數據源名稱和數據庫類型.這是在注冊表中注冊一個系統DSN名稱.
2.在HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI中創建一個子鍵(SubKey)MyAccess,即創建一個鍵為HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\MyAccess,然后在其下創建一些鍵值,詳細描述一個系統DSN的配置信息,主要信息有([]中的內容為筆者注釋):
- DBQ=C:\Inetpub\wwwroot\Test.mdb [字符串,表示數據庫路徑]
- Description=我的ACCESS [字符串,表示數據庫描述]
- Driver=C:\PWIN98\System\odbcjt32.dll [字符串,表示驅動程序,可見ODBCINST.INI]
- DriverId=0x00000019(25) [數字,表示驅動程序標識,不能改變]
- FIL=Ms Access; [字符串,可能與過濾Filter有關]
- SafeTransaction=0x00000000 [數字,可能表示支持事務性操作的個數]
- UID="" [字符串,表示用戶名稱,此處為空字符串]
3.在HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\MyAccess中創建一個子鍵(SubKey)Engines,再在其下創建子鍵(SubKey)Jet,即創建一個鍵為HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\MyAccess\Engines\Jet,然后在其下創建一些鍵值,詳細描述一個系統DSN的數據庫引擎配置信息,主要信息有([]中的內容為筆者注釋):
- ImplicitCommitSync=Yes [字符串,可能表示是否立即反映數據修改]
- MaxBufferSize=0x00000200(512) [數字,表示緩沖區大小]
- PageTimeout=0x00000005(5) [數字,表示頁超時]
- Threads=0x00000003(3) [數字,可能表示支持的***線程數目]
- UserCommitSync=Yes [字符串,可能表示是否立即將數據修改反映到用戶]
以上是建立一個系統DSN的基本信息(其它信息如選項或高級選項等信息也在這里設置,只不過因采用默認信息,注冊表里沒有列出),我們在程序中按上述步驟操作注冊表,同樣也能增加一個系統DSN或修改其配置.
#p#
在下面的例子程序中,將按以上步驟建立一個系統DSN,請注意程序中的注釋.
{*******************************************************
在本程序中,創建一個ODBC系統數據源(DSN),
數據源名稱:MyAccess 數據源描述:新數據源
數據庫類型:ACCESS97
對應數據庫:C:\Inetpub\wwwroot\test.mdb
*******************************************************}
{ 注意應在USES語句中包含Registry }
- procedure TForm1.Button1Click(Sender: TObject);
- var
- registerTemp : TRegistry;
- bData : array[ 0..0 ] of byte;
- begin
- registerTemp := TRegistry.Create; //建立一個Registry實例
- with registerTemp do
- begin
- RootKey:=HKEY_LOCAL_MACHINE;//設置根鍵值為HKEY_LOCAL_MACHINE
- //找到Software\ODBC\ODBC.INI\ODBC Data Sources
- if OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources',True) then
- begin //注冊一個DSN名稱
- WriteString( 'MyAccess', 'Microsoft Access Driver (*.mdb)' );
- end
- else
- begin//創建鍵值失敗
- memo1.lines.add('增加ODBC數據源失敗');
- exit;
- end;
- CloseKey;
- //找到或創建Software\ODBC\ODBC.INI\MyAccess,寫入DSN配置信息
- if OpenKey('Software\ODBC\ODBC.INI\MyAccess',True) then
- begin
- WriteString( 'DBQ', 'C:\inetpub\wwwroot\test.mdb' );//數據庫目錄
- WriteString( 'Description', '我的新數據源' );//數據源描述
- WriteString( 'Driver', 'C:\PWIN98\SYSTEM\odbcjt32.dll' );//驅動程序DLL文件
- WriteInteger( 'DriverId', 25 );//驅動程序標識
- WriteString( 'FIL', 'Ms Access;' );//Filter依據
- WriteInteger( 'SafeTransaction', 0 );//支持的事務操作數目
- WriteString( 'UID', '' );//用戶名稱
- bData[0] := 0;
- WriteBinaryData( 'Exclusive', bData, 1 );//非獨占方式
- WriteBinaryData( 'ReadOnly', bData, 1 );//非只讀方式
- end
- else//創建鍵值失敗
- begin
- memo1.lines.add('增加ODBC數據源失敗');
- exit;
- end;
- CloseKey;
- //找到或創建Software\ODBC\ODBC.INI\MyAccess\Engines\Jet
- //寫入DSN數據庫引擎配置信息
- if OpenKey('Software\ODBC\ODBC.INI\MyAccess\Engines\Jet',True) then
- begin
- WriteString( 'ImplicitCommitSync', 'Yes' );
- WriteInteger( 'MaxBufferSize', 512 );//緩沖區大小
- WriteInteger( 'PageTimeout', 10 );//頁超時
- WriteInteger( 'Threads', 3 );//支持的線程數目
- WriteString( 'UserCommitSync', 'Yes' );
- end
- else//創建鍵值失敗
- begin
- memo1.lines.add('增加ODBC數據源失敗');
- exit;
- end;
- CloseKey;
- memo1.lines.add('增加新ODBC數據源成功');
- Free;
- end;
- end;
通過上面的代碼,我們就能夠在程序中動態設置ODBC數據源了。
【編輯推薦】