非access數(shù)據(jù)庫在vb中的編程及應用
visualbasic有著強大的數(shù)據(jù)庫存取能力,不僅能夠直接支持msaccess數(shù)據(jù)庫,而且通過其內(nèi)部安裝的isam驅動程序使它能間接支持foxpro、dbase等外來數(shù)據(jù)庫。本文不僅從vb數(shù)據(jù)庫體系結構的角度探討了vb對這些外來數(shù)據(jù)庫的支持,還結合了一些實例具體闡述了使用數(shù)據(jù)庫存取對象變量的方法實現(xiàn)這些外來數(shù)據(jù)庫的新建、庫結構修改、顯示及其運行環(huán)境設置。
關鍵詞
visualbasicaccess,外來數(shù)據(jù)庫,數(shù)據(jù)庫
正文
存取對象變量庫結構 作為一個功能較完備的windows軟件開發(fā)平臺,visualbasic專業(yè)版提供了對數(shù)據(jù)庫應用的強大支持。尤其提供了使用數(shù)據(jù)控件和綁定控制項,使用數(shù)據(jù)庫存取對象變量(dataaccessobjectvariable),直接調(diào)用odbc2.0api接口函數(shù)等三種訪問數(shù)據(jù)庫的方法。對其標準內(nèi)置的msaccess數(shù)據(jù)庫,它可以提供不弱于專業(yè)數(shù)據(jù)庫軟件的支持,可以進行完整的數(shù)據(jù)庫維護、操作及其事務處理。在vb中,將非access數(shù)據(jù)庫稱為外來數(shù)據(jù)庫。對于foxpro、dbase、paradox等外來數(shù)據(jù)庫。雖然借助vb的datamanager能夠對這些數(shù)據(jù)庫進行new、open、design、delete等操作,但在應用程序的運行狀態(tài)中并不能從底層真正實現(xiàn)這些功能。本文從使用數(shù)據(jù)庫存取對象變量的方法出發(fā),實現(xiàn)了非access格式數(shù)據(jù)庫(以foxpro數(shù)據(jù)庫為例)的建新庫、拷貝數(shù)據(jù)庫結構、動態(tài)調(diào)入等操作,闡述了從編程技巧上彌補vb對這些外來數(shù)據(jù)庫支持不足的可行性。
一、vb數(shù)據(jù)庫的體系結構具體的vb的數(shù)據(jù)庫結構。
vb數(shù)據(jù)庫的核心結構是所謂的microsoftjet數(shù)據(jù)庫引擎,jet引擎的作用就像是一塊“面板”,在其上可以插入多種isam(indexedsequentialaccessmethod,即索引順序存取方法)數(shù)據(jù)驅動程序。jet引擎為access格式數(shù)據(jù)庫提供了直接的內(nèi)部(build-in)支持,這就是vb對access數(shù)據(jù)庫具有豐富支持的真正原因。vb專業(yè)版中提供了foxpro、dbase(或xbase)、paradox、btrieve等數(shù)據(jù)庫的isam驅動程序,這就使得vb能支持這些數(shù)據(jù)庫格式。另外,其他的許多兼容isam的驅動程序也可以通過從廠商的售后服務得到。因而從理論上說,vb能支持所有兼容isam的數(shù)據(jù)庫格式(前提是只需獲得這些數(shù)據(jù)庫的isam驅動接口程序)。由上可見,msjet引擎實質(zhì)上提供了:一個符合ansi標準的語法分析器;為查詢結果集的使用而提供的內(nèi)存管理功能;同所支持的數(shù)據(jù)庫的外部接口;為應用代碼提供的內(nèi)部接口。實際上,在vb中從一種數(shù)據(jù)庫類型轉化為另一種數(shù)據(jù)庫類型幾乎不需要或只需要很少的代碼修改。而且,盡管dbase、paradox本身的ddl(datadefinitionlanguage,即數(shù)據(jù)定義語言)和dml(datamanipulationlanguage,即數(shù)據(jù)操縱語言)是非結構化查詢的,但它們?nèi)匀豢梢允褂胿b的sql語句和jet引擎來操縱。從vb的程序代碼的角度來看,odbc,isam驅動程序以及msaccess數(shù)據(jù)庫的整個外部結構夠可以統(tǒng)一為一個一致的編程接口。也即是說,提供給vb應用程序員的記錄集對象視圖同所使用的數(shù)據(jù)庫格式及類型是相互獨立的。即對foxpro等數(shù)據(jù)庫仍然可以使用眾多的數(shù)據(jù)庫存取對象變量,這就為非access數(shù)據(jù)庫的訪問提供了最重要的方法。
二、使用非access數(shù)據(jù)庫時的參數(shù)設置及配置文件的參數(shù)讀取
如果在vb的程序中使用了數(shù)據(jù)庫的操作,將應用程序生成exe文件或打包生成安裝程序后,則必須提供一個配置(.ini)文件,在ini文件中可以對不同類型的數(shù)據(jù)庫進行設置。如果找不到這個ini文件,將會導致不能訪問數(shù)據(jù)庫。通常情況下,ini文件的文件名和應用程序的名稱相同,所以如果沒有指明,vb的程序會在windows子目錄中去找和應用程序同名的ini文件?梢允褂胿b中的setdataaccessoptions語句來設置ini文件。
setdataaccessoptions語句的用法如下:
setdataaccessoptions1,inifilename
其中inifilename參數(shù)指明的是ini文件的帶路徑的文件名。值得注意的是,當應用程序找不到這個ini文件時,或在調(diào)用opendatabase函數(shù)時對其connect參數(shù)值沒有設定為vb規(guī)定的標準值,如對foxpro2.5格式設定為了“foxpro;”(應為“foxpro2.5;”),或者沒有安裝相應的isam驅動程序,則此時vb會顯示一條錯誤信息“notfoundinstallableisam”。通常,ini文件在應用程序分發(fā)出去以前已經(jīng)生成,或者在安裝時動態(tài)生成,也可以在應用程序中自己生成。通常這種ini文件中有“[options]”、“[isam]”、“[installedisams]”、“[foxproisam]”、“[dbaseisam]”、“[paradoxisam]”等設置段,對于一個完整的應用程序則還應有一個屬于應用程序自己的設置段如“[mydb]”?稍谄渲性O置datatype、server、database、openonstartup、displaysql、querytimeout等較為重要的數(shù)據(jù)庫參數(shù),并以此限定應用程序一般的運行環(huán)境。windowsapi接口函數(shù)在kernel.exe動態(tài)鏈接庫中提供了一個oswriteprivateprofilestring函數(shù),此函數(shù)能按windows下配置文件(.ini)的書寫格式寫入信息。在通常情況下,應用程序還需要在運行時讀取配置文件內(nèi)相關項的參數(shù)。比如pagetimeout(頁加鎖超時時限)、maxbuffersize(緩沖區(qū)大。ockretry(加鎖失敗時重試次數(shù))等參數(shù),通過對這些參數(shù)的讀取對應用程序運行環(huán)境的設定、潛在錯誤的捕獲等均會有很大的改善。設此應用程序的配置文件為mydb.ini,則具體過程如下:
funtiongetinistring$(byvalfname$,byvalszitem$,byvalszdefault$)’此自定義子函數(shù)實現(xiàn)ini文件內(nèi)設置段內(nèi)參數(shù)的讀取
dimtmpasstring,xasinteger
tmp=string(2048,32)
x=osgetprivateprofilestring(fname$,szitem$,szdefault$,tmp,len(tmp),“mydb.ini”)
getinistring=mid$(tmp,1,x)
endfunction
以下這些函數(shù)的聲明可寫在模塊文件內(nèi),且每個函數(shù)的聲明必須在一行內(nèi)
declarefunctionosgetprivateprofilestring%lib"kernel"alias"getprivateprofilestring"(byvalappname$,byvalkeyname$,byvalkeydefault$,byvalreturnstring$,byvalnumbytesasinteger,byvalfilename$)
declarefunctionoswriteprivateprofilestring%lib"kernel"alias"writeprivateprofilestring"(byvalappname$,byvalkeyname$,byvalkeydefault$,byvalfilename$)
declarefunctionosgetwindowsdirectory%lib"kernel"alias"getwindowsdirectory"(byvala$,byvalb%)
subform1_load()
dimstasstringdimxasinteger
dimtmpasstringtmp=string$(255,32)
’在ini文件內(nèi)為各種數(shù)據(jù)庫格式指明已安裝的相應isam驅動程序
x=oswriteprivateprofilestring("installableisams","paradox3.x","pdx110.dll","mydb.ini")
x=oswriteprivateprofilestring("installableisams","dbaseiii","xbs110.dll","mydb.ini")
x=oswriteprivateprofilestring("installableisams","dbaseiv","xbs110.dll","mydb.ini")
x=oswriteprivateprofilestring("installableisams","foxpro2.0","xbs110.dll","mydb.ini")
x=oswriteprivateprofilestring("installableisams","foxpro2.5","xbs110.dll","mydb.ini")
x=oswriteprivateprofilestring("installableisams","btrieve","btrv110.dll","mydb.ini")
x=oswriteprivateprofilestring("dbaseisam","deleted","on","mydb.ini")
’指明ini文件的位置
x=osgetwindowsdirectory(tmp,255)
st=mid$(tmp,1,x)setdataaccessoption1,st+"mydb.ini"
’獲得ini文件一些參數(shù)
gwmaxgridrows=val(getinistring(“mydb.ini”,"maxrows","250"))
glquerytimeout=val(getinistring(“mydb.ini”,"querytimeout","5"))
gllogintimeout=val(getinistring(“mydb.ini”,"logintimeout","20"))
endsub
三、數(shù)據(jù)存取對象變量對外來數(shù)據(jù)庫編程的方法及其實例
在vb專業(yè)版數(shù)據(jù)庫編程的三種方法中,第二種—使用數(shù)據(jù)庫存取對象變量(dao)的方法最具有功能強大、靈活的特點。它能夠在程序中存取odbc2.0的管理函數(shù);可以控制多種記錄集類型:dynaset,snapshot及table記錄集合對象;可以存儲過程和查詢動作;可以存取數(shù)據(jù)庫集合對象,例如tabledefs,fields,indexes及querydefs;具有真正的事物處理能力。因而,這種方法對數(shù)據(jù)庫處理的大多數(shù)情況都非常適用。由于vb中的記錄集對象與所使用的數(shù)據(jù)庫格式及類型是相互獨立的,所以在非access數(shù)據(jù)庫中也可以使用數(shù)據(jù)庫存取對象變量的方法。因而對foxpro等外來數(shù)據(jù)庫而言,使用數(shù)據(jù)庫存取對象變量的方法同樣也是一種最佳的選擇。有一點需要注意的是,vb的標準版中僅能使用數(shù)據(jù)控件(datacontrol)對數(shù)據(jù)庫中的記錄進行訪問,主要的數(shù)據(jù)庫存取對象中也僅有database、dynaset對象可通過數(shù)據(jù)控件的屬性提供,其它的重要對象如tabledef、field、index、querydef、snapshot、table等均不能在vb的標準版中生成,所以使用數(shù)據(jù)存取對象變量的方法只能用vb3.0以上的專業(yè)版。
非access數(shù)據(jù)庫的新建及庫結構的修改
vb專業(yè)版中的數(shù)據(jù)庫存取對象變量可以分為兩類,一類用于數(shù)據(jù)庫結構的維護和管理,另一類用于數(shù)據(jù)的存取。其中表示數(shù)據(jù)庫結構時可以使用下面的對象:database、tabledef、field、index,以及三個集合(collection):tabledefs、fields和indexes。每一個集合都是由若干個對象組成的,這些數(shù)據(jù)對象的集合可以完全看作是一個數(shù)組,并按數(shù)組的方法來調(diào)用。一旦數(shù)據(jù)庫對象建立后,就可以用它對數(shù)據(jù)庫的結構進行修改和數(shù)據(jù)處理。對于非access數(shù)據(jù)庫,大部分都是對應于一個目錄,所以可以使用vb的mkdir語句先生成一個目錄,亦即新建一個數(shù)據(jù)庫。而每一個非access數(shù)據(jù)庫文件可看作是此目錄下的一個數(shù)據(jù)表(table),但實際上它們是互相獨立的。下面是新建一個foxpro2.5格式數(shù)據(jù)庫的程序實例。
subcreatenew()
dimdb1asdatabase,tdastabledefsdimt1asnewtabledef,f1asnewfield,f2asnewfield,f3asnewfield
dimix1asnewindex
dimpathasstring
constdb_text=10,db_integer=3
chdir""path$=inputbox("請輸入新路徑名:","輸入對話框")mkdirpath$
’新建一個子目錄
setdb1=opendatabase(path$,true,false,"foxpro2.5;")
settd=db1.tabledefst1.name="mydb"
’新建一個數(shù)據(jù)表,數(shù)據(jù)表名為mydb
f1.name="name",f1.type=db_text,f1.size=20f2.name="class",f2.type=db_text,f2.size=20f3.name="grade",f3.type=db_integert1.fields.appendf1
’向數(shù)據(jù)表中添加這些字段t1.fields.appendf2