在DELPHI程式中自動設定ODBC資料來源

2021-06-15 18:29:21 字數 4865 閱讀 2533

在delphi資料庫應用程式中,我們訪問資料庫通常有兩種方法.一種是通過bde資料庫搜尋引擎,即利用delphi自帶的資料庫驅動程式,這種方法的優點是速度快,但應用範圍有限,當資料庫版本更新時,有可能不能用於操作新的資料庫;另一種方法是通過odbc,這種方法的優點是可以隨作業系統(如windows)提供,作為標準介面能適應多種資料庫,缺點是速度慢.在程式設計時,我們可以根據需要選擇其中的一種方法.

在利用odbc訪問資料庫時,通常的方法時是在odbc管理面板中設定乙個odbc系統資料來源(系統dsn),然後在dbd中或在程式中設定乙個資料庫別名(alias)對應該dsn,這樣就可以如願以償地運算元據庫了.相信用delphi做過資料庫應用的程式設計師對這方面已經很熟悉了,筆者就不多說了.在實際應用中,筆者曾遇到過這樣的情況,我們的資料庫應用程式是依靠odbc系統資料來源訪問和運算元據庫的,應用程式執行一直良好,直到某一天,乙個對windows系統較為熟悉但又不太精通的使用者不慎修改或刪除了我們預先設定的系統dsn......

於是,筆者就開始研究怎麼在程式中動態地設定odbc系統dsn的內容,這樣就可以增加自己程式的堅固性了.經過整整一天對windows登錄檔的研究,終於找到了odbc管理程式設定dsn的秘密("天地自有公道,付出總會回報!",不是做廣告!),現寫出來與大家共享,也請高手指教.

odbc管理程式設定dsn的秘密在登錄檔中,不信可以到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或修改其配置.

在下面的例子程式中,將按以上步驟建立乙個系統dsn,請注意程式中的注釋.

procedure tform1.button1click(sender: tobject);

varregistertemp : 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)』 );

endelse

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 );//非唯讀方式

endelse//建立鍵值失敗

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』 );

endelse//建立鍵值失敗

begin

memo1.lines.add(』增加odbc資料來源失敗』);

exit;

end;

closekey;

memo1.lines.add(』增加新odbc資料來源成功』);

free;

end;

end;

在DELPHI中設定攝像頭引數

本例子借助了dspack包,只是為了方便,不要它也可以,直接呼叫com。使用directshow9的功能。程式須引用directshow9,dspack,dsutil,comctrls,activex單元。具體如下 var capenum tsysdevenum begin capenum tsys...

delphi設定程式日期格式

在程式初始化時執行下面的方法 讓delphi程式不受windows日期格式的影響 procedure setsysdateformat begin 設定windows系統的短日期的格式 setlocaleinfo locale system default,lo cale sshortdate,yy...

delphi 設定開機自動啟動函式

procedure tmainform.setautorun ok boolean varreg tregistry 首先定義乙個tregistry型別的變數reg begin reg tregistry.create try 建立乙個新鍵 reg.rootkey hkey local machin...