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