在VB中兼容非ACCESS數(shù)據(jù)庫(kù)的技巧

字號(hào):

一個(gè)完整的數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)應(yīng)是能兼容市面上各種較流行數(shù)據(jù)格式的系統(tǒng),它充分考慮了不同用戶(hù)的實(shí)際要求。鑒于目前市面上有多種數(shù)據(jù)庫(kù)格式(如Foxpro、DBase、Paradox等)流行,因而在VB數(shù)據(jù)庫(kù)應(yīng)用程序中兼容非ACCESS數(shù)據(jù)庫(kù)就顯得尤為重要了。
    作為一種流行的開(kāi)發(fā)平臺(tái),VB提供了強(qiáng)大的數(shù)據(jù)庫(kù)功能。主要有以下三種:數(shù)據(jù)控件法:使用數(shù)據(jù)存取對(duì)象(Data Access Object )法;直接調(diào)用ODBC 2.0 API接口函數(shù)法。其中調(diào)用數(shù)據(jù)存取對(duì)象的方法相對(duì)其它兩種方法具有方便靈活、功能強(qiáng)大的突出優(yōu)點(diǎn)。本文即從調(diào)用數(shù)據(jù)庫(kù)存取對(duì)象的方法出發(fā),實(shí)現(xiàn)了非ACCESS格式數(shù)據(jù)庫(kù)(以FoxPro數(shù)據(jù)庫(kù)為例)的建新庫(kù)、拷貝數(shù)據(jù)庫(kù)結(jié)構(gòu)、動(dòng)態(tài)調(diào)入等操作,闡述了從編程技巧上彌補(bǔ)VB對(duì)這些外來(lái)數(shù)據(jù)庫(kù)支持不足的可行性。
    一、VB數(shù)據(jù)庫(kù)的體系結(jié)構(gòu)
    VB數(shù)據(jù)庫(kù)的核心結(jié)構(gòu)是所謂的MicroSoft JET數(shù)據(jù)庫(kù)引擎,它為VB與數(shù)據(jù)庫(kù)的接口提供了基本的方法和手段。JET引擎被Visual Basic、Microsoft ACCESS和其它Microsoft產(chǎn)品所共享。因而在VB中Access數(shù)據(jù)庫(kù)格式是一種標(biāo)準(zhǔn)的內(nèi)置格式,所有的非ACCESS數(shù)據(jù)庫(kù)都被稱(chēng)為外來(lái)數(shù)據(jù)庫(kù)。
    JET引擎的作用就像是一塊“面板”,在其上可以插入多種索引順序存取方法(即ISAM)數(shù)據(jù)驅(qū)動(dòng)程序。這就是VB對(duì)非ACCESS數(shù)據(jù)庫(kù)具有豐富支持的真正原因。VB專(zhuān)業(yè)版中提供了FoxPro、dBASE(或Xbase)、Paradox、Btrieve等數(shù)據(jù)庫(kù)的ISAM驅(qū)動(dòng)程序,這就使得VB能支持這些數(shù)據(jù)庫(kù)格式。另外,其他的許多兼容ISAM的驅(qū)動(dòng)程序也可以通過(guò)從廠商的售后服務(wù)得到。因而從理論上說(shuō),VB能支持所有兼容ISAM的數(shù)據(jù)庫(kù)格式(前提是只需獲得這些數(shù)據(jù)庫(kù)的ISAM驅(qū)動(dòng)接口程序)。
    二、使用非ACCESS數(shù)據(jù)庫(kù)時(shí)的參數(shù)設(shè)置及配置文件的參數(shù)讀取
    值得注意的是,大多數(shù)的程序員都不注重?cái)?shù)據(jù)庫(kù)配置文件的使用,殊不知這是極為重要的。
    如果在VB的程序中使用了數(shù)據(jù)庫(kù)的操作,將應(yīng)用程序生成EXE文件或打包生成安裝程序后,則必須提供一個(gè)數(shù)據(jù)庫(kù)配置(.INI)文件,在INI   文件中可以對(duì)不同類(lèi)型的數(shù)據(jù)庫(kù)進(jìn)行設(shè)置。如果找不到這個(gè)INI文件,將會(huì)導(dǎo)致不能訪問(wèn)數(shù)據(jù)庫(kù)。通常情況下,INI文件的文件名和應(yīng)用程序的名稱(chēng)相同,所以如果沒(méi)有指明,VB的程序會(huì)在Windows子目錄中去找和應(yīng)用程序同名的INI文件。可以使用VB中的SetDataACCESSOptions語(yǔ)句來(lái)設(shè)置INI文件。
    SetDataACCESSOptions語(yǔ)句的用法如下:
    SetDataACCESSOptions 1,IniFileName
    其中IniFileName參數(shù)指明的是INI文件的帶路徑的文件名。
    值得注意的是,當(dāng)應(yīng)用程序找不到這個(gè)INI文件時(shí),或在調(diào)用OpenDataBase函數(shù)時(shí)對(duì)其Connect參數(shù)值沒(méi)有設(shè)定為VB規(guī)定的標(biāo)準(zhǔn)值,如對(duì) 2.5格式設(shè)定為了“FoxPro;”(應(yīng)為“FoxPro 2.5;”),或者沒(méi)有安裝相應(yīng)的ISAM驅(qū)動(dòng)程序,則此時(shí)VB會(huì)顯示一條錯(cuò)誤信息“Not Found Installable ISAM”。
    通常,INI文件在應(yīng)用程序分發(fā)出去以前已經(jīng)生成,或者在安裝時(shí)動(dòng)態(tài)生成,也可以在應(yīng)用程序中自己生成。通常這種INI文件中有“[Options]”、“[ISAM]”、“[Installed ISAMs]”、“[FoxPro ISAM]”、“[dBASE ISAM]”、“[Paradox ISAM]”等設(shè)置段,對(duì)于 一個(gè)完整的應(yīng)用程序則還應(yīng)有一個(gè)屬于應(yīng)用程序自己的設(shè)置段如“[MyDB]”??稍谄渲性O(shè)置DataType、Server、DataBase、 OpenOnStartup、DisplaySQL、QueryTimeOut等較為重要的數(shù)據(jù)庫(kù)參數(shù),并以此限定應(yīng)用程序一般的運(yùn)行環(huán)境。
    Windows API接口函數(shù)在Win95系統(tǒng)提供的動(dòng)態(tài)鏈接庫(kù)中提供了一個(gè)OSWritePrivateProfileString函數(shù),此函數(shù)能按Windows下配置文件(.INI)的書(shū)寫(xiě)格式寫(xiě)入信息。
    在通常情況下,應(yīng)用程序還需要在運(yùn)行時(shí)讀取配置文件內(nèi)相關(guān)項(xiàng)的參數(shù)。比如PageTimeOut(頁(yè)加鎖超時(shí)時(shí)限)、MaxBufferSize(緩沖區(qū)大?。?、LockRetry(加鎖失敗時(shí)重試次數(shù))等參數(shù),通過(guò)對(duì)這些參數(shù)的讀取對(duì)應(yīng)用程序運(yùn)行環(huán)境的設(shè)定、潛在錯(cuò)誤的捕獲等均會(huì)有很大的改善。
    設(shè)此應(yīng)用程序的數(shù)據(jù)庫(kù)配置文件為MyDB.INI,則具體過(guò)程如下:
    Funtion GetINIString$( Byval Fname$,Byval szItem$,Byval szDeFault$ )
    ’此自定義子函數(shù)實(shí)現(xiàn)INI文件內(nèi)設(shè)置段內(nèi)參數(shù)的讀取
    Dim Tmp As String, x As Integer
    Tmp = String( 2048,32 )
    x = OSGetPrivateProfileString( Fname$,szItem$,szDefault$,Tmp,Len(Tmp),“MyDB.INI”)
    GetINIString = Mid$( Tmp,1,x )
    End Function
    通過(guò)此函數(shù)就能實(shí)現(xiàn)對(duì)各種數(shù)據(jù)庫(kù)格式的讀取。
    三、調(diào)用數(shù)據(jù)存取對(duì)象對(duì)非ACCESS數(shù)據(jù)庫(kù)編程的方法及其實(shí)例
    VB專(zhuān)業(yè)版中使用數(shù)據(jù)庫(kù)存取對(duì)象變量(DAO)的方法有功能強(qiáng)大、編程靈活的特點(diǎn)。它能夠在程序中存取ODBC 2.0的管理函數(shù);可以控制多種記錄集類(lèi)型:Dynaset,Snapshot及Table記錄集合對(duì)象;可以存儲(chǔ)過(guò)程和查詢(xún)動(dòng)作;可以存取數(shù)據(jù)庫(kù)集合對(duì)象,例如TableDefs,F(xiàn)ields,Indexes及QueryDefs;具有真正的事物處理能力。這種方法對(duì)數(shù)據(jù)庫(kù)處理的大多數(shù)情況都非常適用。
    從VB的程序代碼的角度來(lái)看,提供給VB程序員的記錄集對(duì)象(RecordSet)同所使用的數(shù)據(jù)庫(kù)格式及類(lèi)型是相互獨(dú)立的。即對(duì)FoxPro等數(shù)據(jù)庫(kù)仍然可以使用眾多的數(shù)據(jù)庫(kù)存取對(duì)象變量,這就為非ACCESS數(shù)據(jù)庫(kù)的訪問(wèn)提供了最重要的前提和方法。
    在VB中從一種數(shù)據(jù)庫(kù)類(lèi)型轉(zhuǎn)化為另一種數(shù)據(jù)庫(kù)類(lèi)型幾乎不需要或只需要很少的代碼修改。而且,盡管dBASE、Paradox本身的DDL(Data Definition Language,即數(shù)據(jù)定義語(yǔ)言)和DML(Data Manipulation Language,即數(shù)據(jù)操縱語(yǔ)言)是非結(jié)構(gòu)化查詢(xún)的,但它們?nèi)匀豢梢允褂肰B的SQL語(yǔ)句和JET引擎來(lái)操縱。
    因而對(duì)FoxPro等非ACCESS數(shù)據(jù)庫(kù)而言,調(diào)用數(shù)據(jù)庫(kù)存取對(duì)象的方法同樣也是一種的選擇。