西安外事學院工學院 文 欣
存取對象變量庫結構作為一個功能較完備的Windows軟件開發平臺,Visual Basic專業版提供了對數據庫應用的強大支持。尤其提供了使用數據控件和綁定控制項,使用數據庫存取對象變量(Data Access Object Variable),直接調用ODBC 2.0 API接口函數等三種訪問數據庫的方法。對其標準內置的Ms Access數據庫,它可以提供不弱于專業數據庫軟件的支持,可以進行完整的數據庫維護、操作及其事務處理。在VB中,將非Access數據庫稱為外來數據庫。對于FoxPro、dBASE、Paradox等外來數據庫。雖然借助VB的Data Manager能夠對這些數據庫進行NEW、OPEN、DESIGN、DELETE等操作,但在應用程序的運行狀態中并不能從底層真正實現這些功能。本文從使用數據庫存取對象變量的方法出發,實現了非Access格式數據庫(以FoxPro數據庫為例)的建新庫、拷貝數據庫結構、動態調入等操作,闡述了從編程技巧上彌補VB對這些外來數據庫支持不足的可行性。
VB數據庫的核心結構是所謂的MicroSoft JET數據庫引擎,JET引擎的作用就像是一塊“面板”,在其上可以插入多種ISAM(Indexed Sequential Access Method,即索引順序存取方法)數據驅動程序。
VB專業版中提供了FoxPro、dBASE(或Xbase)、Paradox、Btrieve等數據庫的ISAM驅動程序,這就使得VB能支持這些數據庫格式。另外,其他的許多兼容ISAM的驅動程序也可以通過從廠商的售后服務得到。因而從理論上說,VB能支持所有兼容ISAM的數據庫格式(前提是只需獲得這些數據庫的ISAM驅動接口程序)。
由上可見,Ms JET引擎實質上提供了:一個符合ANSI標準的語法分析器;為查詢結果集的使用而提供的內存管理功能;同所支持的數據庫的外部接口;為應用代碼提供的內部接口。實際上,在VB中從一種數據庫類型轉化為另一種數據庫類型幾乎不需要或只需要很少的代碼修改。而且,盡管dBASE、Paradox本身的DDL(Data Definition Language,即數據定義語言)和DML(Data Manipulation Language,即數據操縱語言)是非結構化查詢的,但它們仍然可以使用VB的SQL語句和JET引擎來操縱。
從VB的程序代碼的角度來看,ODBC,ISAM驅動程序以及Ms Access數據庫的整個外部結構夠可以統一為一個一致的編程接口。也即是說,提供給VB應用程序員的記錄集對象視圖同所使用的數據庫格式及類型是相互獨立的。即對FoxPro等數據庫仍然可以使用眾多的數據庫存取對象變量,這就為非Access數據庫的訪問提供了最重要的方法。
如果在VB的程序中使用了數據庫的操作,將應用程序生成EXE文件或打包生成安裝程序后,則必須提供一個配置(.INI)文件,在INI文件中可以對不同類型的數據庫進行設置。通常情況下,INI文件的文件名和應用程序的名稱相同,所以如果沒有指明,VB的程序會在Windows子目錄中去找和應用程序同名的INI文件。可以使用VB中的SetDataAccessOptions語句來設置INI文件。
SetDataAccessOptions語句的用法如下:
SetDataAccessOptions 1,IniFile-Name其中IniFileName參數指明的是INI文件的帶路徑的文件名。值得注意的是,當應用程序找不到這個INI文件時,或在調用OpenDataBase函數時對其Connect參數值沒有設定為VB規定的標準值,如對FoxPro 2.5格式設定為了"FoxPro;"(應為"FoxPro 2.5;"),或者沒有安裝相應的ISAM驅動程序,則此時VB會顯示一條錯誤信息"Not Found Installable ISAM"。通常,INI文件在應用程序分發出去以前已經生成,或者在安裝時動態生成,也可以在應用程序中自己生成。通常這種INI文件中有"[Options]"、"[ISAM]"、"[Installed ISAMs]"、"[FoxPro ISAM]"、"[dBASE ISAM]"、"[Paradox ISAM]"等設置段,對于一個完整的應用程序則還應有一個屬于應用程序自己的設置段如"[MyDB]"。可在其中設置DataType、Server、DataBase、OpenOnStartup、DisplaySQL、QueryTimeOut等較為重要的數據庫參數,并以此限定應用程序一般的運行環境。Windows API接口函數在Kernel.exe動態鏈接庫中提供了一個OSWritePrivateProfileString函數,此函數能按Windows下配置文件(.INI)的書寫格式寫入信息。
設此應用程序的配置文件為MyDB.INI,則具體過程如下:Funtion GetINIString$(Byval Fname$,Byval szItem$,Byval szDeFault$)'此自定義子函數實現INI文件內設置段內參數的讀取Dim Tmp As String,x As Integer Tmp=String(2048,32)x=OSGetPrivat eProfileString(Fname$,szItem$,szDefault$,Tmp,Len(Tmp),"MyDB.INI")GetINIString=Mid$(Tmp,1,x)EndFunction以下這些函數的聲明可寫在模塊文件內,且每個函數的聲明必須在一行內Declare Function OSGetPrivateProfileString% Lib"Kerne l"Alias"GetPrivateProfileString"(By Val AppName$,ByVal KeyName$,ByVal keydefault$,ByVal ReturnString$,ByVal NumBytes As Integer,ByVal FileName$)Declare Function OSWritePrivateProfileString% Lib"Kern el"Alias"WritePrivateProfileString"(B yVal AppName$,ByVal KeyName$,ByVal keydefault$,ByVal FileName$)Declare Function OSGetWindowsDirectory% Lib"K ernel"Alias"GetWindowsDirectory"(ByV al a$,ByVal b%)Sub Form1_Load( )Dim st As String Dim x As Integer Dim tmp As String tmp=String$(255,32)'
INI文件內為各種數據庫格式指明已安裝的相應ISAM驅動程序x=OSWrit ePrivateProfileString(“Installab le ISAMS”,"Paradox 3.X","PDX110.DLL","MyDB.INI")x=OSWritePrivateP rofileString("Installable ISAMS","dBASE III","XBS110.DLL","MyDB.INI")x=OSWritePrivateProfileString("Installable ISAMS","dBASE IV","XBS110.DLL","MyDB.INI")x=OSWrite PrivateProfileString("Installable ISAMS","FoxPro 2.0","XBS110.DLL","MyDB.INI" )x=OSWritePrivateProfile String("Installable ISAMS","FoxPro 2.5","XBS110.DLL","MyDB.INI")x=O SWritePrivateProfileString("Instal lable ISAMS","Btrieve","BTRV110.DLL","MyDB.INI")x=OSWritePrivatePro fileString("dBase ISAM","Deleted","On","MyDB.INI")’指明INI文件的位置x=OSGetWindowsDirectory(tmp,255)st=Mid$(tmp,1,x)SetDataAccessOption 1,s t+"m y d b.i n i"‘獲得I N I文件一些參數g w M a x G r i d R o w s=Val(GetINIString("MyDB.INI","MaxRows","250")) glQueryTimeout=Val(GetINIString("MyDB.INI","QueryTimeout","5")) glLoginTimeout=Val(GetINIString("MyDB.INI","LoginTimeout","20" ))End Sub
在VB專業版數據庫編程的三種方法中,第二種,使用數據庫存取對象變量(DAO)的方法最具有功能強大、靈活的特點。它能夠在程序中存取ODBC 2.0的管理函數;可以控制多種記錄集類型:Dynaset,Snapshot及Table記錄集合對象;可以存儲過程和查詢動作;可以存取數據庫集合對象,例如TableDefs,Fields,Indexes及QueryDefs;具有真正的事物處理能力。因而,這種方法對數據庫處理的大多數情況都非常適用。
由于VB中的記錄集對象與所使用的數據庫格式及類型是相互獨立的,所以在非Access數據庫中也可以使用數據庫存取對象變量的方法。因而對FoxPro等外來數據庫而言,使用數據庫存取對象變量的方法同樣也是一種最佳的選擇。
非Access數據庫的新建及庫結構的修改VB專業版中的數據庫存取對象變量可以分為兩類,一類用于數據庫結構的維護和管理,另一類用于數據的存取。其中表示數據庫結構時可以使用下面的對象:
DataBase、TableDef、Field、Index,以及三個集合(Collection):TableDefs、Fields和Indexes。每一個集合都是由若干個對象組成的,這些數據對象的集合可以完全看作是一個數組,并按數組的方法來調用。對于非Access數據庫,大部分都是對應于一個目錄,所以可以使用VB的MkDir語句先生成一個目錄,亦即新建一個數據庫。而每一個非Access數據庫文件可看作是此目錄下的一個數據表(Table),但實際上它們是互相獨立的。
下面是新建一個FoxPro 2.5格式數據庫的程序實例。
Sub CreateNew( )Dim Db1 As database,Td As TableDefs Dim T1 As New Tabledef,F1 As New Field,F2 As New Field,F3 As New Field Dim Ix1 As New Index Dim Path As String Const DB_TEXT=10,DB_INTEGER=3 ChDir""Path$=InputBox(“請輸入新路徑名:”,“輸入對話框”)MkDir Path$‘新建一個子目錄Set Db1=OpenDatabase(Path$,True,False,"FoxPro 2.5;")Set Td = Db1.TableDefs T1.Name="MyDB"‘新建一個數據表,數據表名為MyDB F1.Name="Name",F1.Type=DB_TEXT,F1.Size=20 F2.Name="Class",F2.Type=DB_TEXT,F2.Size=20 F3.Name="Grade",F3.Type=DB_INTEGER T1.Fields.Append F1‘向數據表中添加這些字段T1.Fields.Append F2。
[1]明日科技.Visual Basic開發經驗技巧寶典[M].人民郵電出版社,2007,9.
[2]邱李華,等.Visual Basic程序設計教程[M].機械工業出版社,2007,7.
[3]李淑華.VB程序設計及應用[M].高等教育出版社,2008,9.
[4]張勇.Visual Basic課程設計案例精編[M].中國水利水電出版社,2010,3.