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

字號:

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