在VB中相容非ACCESS資料庫的技巧

來源:互聯網
上載者:User

本文從VB資料庫體繫結構的角度出發,結合一個具體執行個體,闡述了在VB中相容非ACCESS格式資料庫的具體方法和技巧。

關鍵詞:VB、非ACCESS資料庫、資料存取對象

一個完整的資料庫管理系統(DBMS)應是能相容市面上各種較流行資料格式的系統,它充分考慮了不同使用者的實際要求。鑒於目前市面上有多種資料庫格式(如Foxpro、DBase、Paradox等)流行,因而在VB資料庫應用程式中相容非ACCESS資料庫就顯得尤為重要了。

作為一種流行的開發平台,VB提供了強大的資料庫功能。主要有以下三種:資料控制項法:使用資料存取對象(Data Access Object )法;直接調用ODBC 2.0 API介面函數法。其中調用資料存取對象的方法相對其它兩種方法具有方便靈活、功能強大的突出優點。本文即從調用資料庫存取對象的方法出發,實現了非ACCESS格式資料庫(以FoxPro資料庫為例)的建新庫、拷貝資料庫結構、動態調入等操作,闡述了從編程技巧上彌補VB對這些外來資料庫支援不足的可行性。

一、VB資料庫的體繫結構

VB資料庫的核心結構是所謂的MicroSoft JET資料庫引擎,它為VB與資料庫的介面提供了基本的方法和手段。JET引擎被Visual Basic、Microsoft ACCESS和其它Microsoft產品所共用。因而在VB中Access資料庫格式是一種標準的內建格式,所有的非ACCESS資料庫都被稱為外來資料庫。

JET引擎的作用就像是一塊“面板”,在其上可以插入多種索引順序存取方法(即ISAM)資料驅動程式。這就是VB對非ACCESS資料庫具有豐富支援的真正原因。VB專業版中提供了FoxPro、dBASE(或Xbase)、Paradox、Btrieve等資料庫的ISAM驅動程式,這就使得VB能支援這些資料庫格式。另外,其他的許多相容ISAM的驅動程式也可以通過從廠商的售後服務得到。因而從理論上說,VB能支援所有相容ISAM的資料庫格式(前提是只需獲得這些資料庫的ISAM驅動介面程式)。

二、使用非ACCESS資料庫時的參數設定及設定檔的參數讀取

值得注意的是,大多數的程式員都不注重資料庫設定檔的使用,殊不知這是極為重要的。

如果在VB的程式中使用了資料庫的操作,將應用程式產生EXE檔案或打包產生安裝程式後,則必須提供一個資料庫配置(.INI)檔案,在INI檔案中可以對不同類型的資料庫進行設定。如果找不到這個INI檔案,將會導致不能訪問資料庫。通常情況下,INI檔案的檔案名稱和應用程式的名稱相同,所以如果沒有指明,VB的程式會在Windows子目錄中去找和應用程式同名的INI檔案。可以使用VB中的SetDataACCESSOptions語句來設定INI檔案。

SetDataACCESSOptions語句的用法如下:

SetDataACCESSOptions 1,IniFileName

其中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介面函數在Win95系統提供的動態連結程式庫中提供了一個OSWritePrivateProfileString函數,此函數能按Windows下設定檔(.INI)的書寫格式寫入資訊。

在通常情況下,應用程式還需要在運行時讀取設定檔內相關項目的參數。比如PageTimeOut(頁加鎖逾時時限)、MaxBufferSize(緩衝區大小)、LockRetry(加鎖失敗時重試次數)等參數,通過對這些參數的讀取對應用程式運行環境的設定、潛在錯誤的捕獲等均會有很大的改善。
設此應用程式的資料庫設定檔為MyDB.INI,則具體過程如下:

以下為引用的內容:
Funtion GetINIString$( Byval Fname$,Byval szItem$,Byval szDeFault$ )
’此自訂子函數實現INI檔案內設定段內參數的讀取
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

通過此函數就能實現對各種資料庫格式的讀取。

三、調用資料存取對象對非ACCESS資料庫編程的方法及其執行個體

VB專業版中使用資料庫存取物件變數(DAO)的方法最具有功能強大、編程靈活的特點。它能夠在程式中存取ODBC 2.0的管理函數;可以控制多種記錄集類型:Dynaset,Snapshot及Table記錄集合對象;可以預存程序和查詢動作;可以存取資料庫集合對象,例如TableDefs,Fields,Indexes及QueryDefs;具有真正的事物處理能力。這種方法對資料庫處理的大多數情況都非常適用。

從VB的程式碼的角度來看,提供給VB程式員的記錄集對象(RecordSet)同所使用的資料庫格式及類型是相互獨立的。即對FoxPro等資料庫仍然可以使用眾多的資料庫存取物件變數,這就為非ACCESS資料庫的訪問提供了最重要的前提和方法。

在VB中從一種資料庫類型轉化為另一種資料庫類型幾乎不需要或只需要很少的代碼修改。而且,儘管dBASE、Paradox本身的DDL(Data Definition Language,即資料定義語言 (Data Definition Language))和DML(Data Manipulation Language,即資料操縱語言)是非結構化查詢的,但它們仍然可以使用VB的SQL語句和JET引擎來操縱。

因而對FoxPro等非ACCESS資料庫而言,調用資料庫存取對象的方法同樣也是一種最佳的選擇。

(一)非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
T1.Fields.Append F3
Ix1.Name = "Name" ,Ix1.Fields = "Name", Ix1.Primary = True ’建立索引
T1.Indexes.Append Ix1 ’向資料庫的Indexes集合中添加新的索引
Td.Append T1 ’向TableDefs集合中添加新表
Db1.Close ’必須先關閉資料庫物件再退出
End Sub

在此段程式中值得注意的是,對非Access資料庫的建立不用CreateDatabase函數,而是用OpenDatabase函數,這點與Access資料庫大不一樣,但也僅僅是針對非ACCESS資料庫而言才能用OpenDatabase函數來建立一個資料庫物件。

在VB中,外來資料庫的不同格式只在OpenDatabase函數的最後一個參數Connect中有所體現,不同格式的外來資料庫其Connect參數值也不同,除此以外,在VB專業版中其編程的方法和步驟及技巧是基本相同的。

建立子目錄後,不能用ChDir語句進入它,否則會出現“‘MyDB’ is not a valid path”的錯誤。同時,對F1、F2、F3等建立欄位對象的定義也必須分別定義,否則會出現“Element not defined”(變數未定義)的錯誤。

通過一定的編程技巧還可以實現非ACCESS資料庫的庫結構的拷貝,下面是一段相應的程式。

Function GetPos( TFname$ ) ’此自訂函數完成對帶路徑檔案名稱中最後一個“\”符號的定位

以下為引用的內容:

Dim I As Integer,Tmp As String
Tmp$ = TFname$
For I = 0 To 255
Pos% = Pos% + InStr( 1, Tmp$, "\" )
E1% = InStr( 1, Tmp$, "\" )
Tmp$ = Right$( Tmp$, Len(TFname$) - Pos% )
If E1% = 0 Then ’找到最後一個“\”符號的位置,並記下來
GetPos = Pos%
Exit For
End If
Next I
End Funtion
Sub CopyStruc( )
Dim Db1 As database, Ds1 As Dynaset,Td As TableDefs, Fld As Fields
Dim Fname,SourceF,DestF,Path As String,Pos1 As Integer
CMD1.Filter = "FoxPro資料庫檔案(*.DBF)|*.DBF|所有檔案|*.*" ’CMD1為一個對話方塊的控制名
CMD1.DialogTitle = "調入Ms FoxPro資料庫檔案"
CMD1.FilterIndex = 1
CMD1.Action = 1
DestF$ = InputBox$( "請輸入目標檔案名:", "輸入對話方塊" )
If CMD1.FileName = “ ”Or DestF$ = " " Then
MsgBox "源檔案或目標檔案名為空白"
Exit Sub
Else
SourceF$ = CMD1.Filename
End If
FileCopy SourceF$, DestF$
Pos1% = GetPos( SourceF$ )
Path$ = Left$( SourceF$, Pos1% ) ’獲得源檔案所在的路徑名
Fn$ = Left$( DestF$, InStr(1, DestF$, ".") - 1 ) ’獲得新檔案的資料庫名
’Fn$為實際的Foxpro資料庫名,也即CreateDynaset函數內的source屬性值
Set Db1 = OpenDatabase( Path$, True, False, "FoxPro 2.5;" )
Set Ds1 = Db1.CreateDynaset( Fn$ )
If Ds1.EOF And Ds1.BOF Then ’資料庫內的無記錄則退出
TotalNum% = 0
MsgBox "此資料表為空白表!"
Exit Sub
End If
’刪除記錄,保留庫結構
Ds1.MoveFirst
Do
Ds1.Delete
Ds1.MoveNext
Loop Until Ds1.EOF
End Sub

可見,拷貝庫結構的方法在於把一個已存在的資料庫拷貝到一個新檔案中,然後再刪除新檔案內的所有記錄,保留其庫結構,得到的就是一個建立的庫結構完整的空庫。

(二)非ACCESS資料庫的動態調入

在實際應用的很多情況下,經常需要在對一些事先並不知道其具體庫結構的資料庫進行調入、顯示及列印其記錄。因而實現未知格式資料庫的動態調入也是評價VB資料庫應用程式相容性的一個重要標誌。

在VB中,網格控制項非常適合用於瀏覽資料庫中的資料,只需把資料放入網格即可。

在使用網格時動態調入的關鍵在於記錄(Colume)內容和欄位(Row)內容(包括欄位的名稱、類型、值等)的讀取,因而產生一個可以對應於一個或多個資料表中的全部或部分記錄的Dynaset對象是非常必要的。Dynaset對象還可以是一個動態查詢的結果,能進行記錄的增加、刪除和修改等操作。

下面是一段用網格顯示FoxPro資料庫的程式。

以下為引用的內容:

Sub DBLoad( )
Dim Db1 As database, Ds1 As Dynaset,Td As TableDefs,Fld As Fields
Dim Fname,Tmp,Path ToTalNum As String,I,J,Pos1 As Integer
Dim MyNum ’定義一個變體型資料
CMD1.Filter = "FoxPro資料庫檔案(*.DBF)|*.DBF|所有檔案|*.*"
CMD1.DialogTitle = "調入Ms FoxPro資料庫檔案"
CMD1.FilterIndex = 1
CMD1.Action = 1
Fname$ = CMD1.Filename
Pos1% = GetPos( Fname$ )
Path$ = Left$( Fname$, Pos1% )
Tmp$ = Right$( Fname$, Len(Fname$)-Pos1)
Fn$ = Left$( Tmp$, Instr( 1,Tmp$,“.”) - 1 )
Set Db1 = OpenDatabase( Path$, True, False, "FoxPro 2.5;" )
Set Ds1 = Db1.CreateDynaset( Fn$ )
If Ds1.EOF And Ds1.BOF Then '資料庫表內無記錄則退出
TotalNum = 0
MsgBox "此資料表為空白表!"
Exit Sub
Else '顯示資料庫表內的實際記錄數
Ds1.MoveLast
TotalNum = Ds1.RecordCount
Grid1.Rows = TotalNum + 1 ’置網格的實際行數
Total.Caption = Str$(TotalNum)
End If
'置網格的實際列數共置每列的寬度
Set Td = Db1.TableDefs
Set Fld = Td( Fn$ ).Fields
Grid1.Cols = Fld.Count + 1
Grid1.ColWidth(0) = 600
For I = 1 To Fld.Count
Grid1.ColWidth(I) = 1500
Next I
'在網格的第一行內填入欄位名
Grid1.Row = 0, Grid1.Col = 0
Grid1.Text = "序號"
For I = 1 To Fld.Count
Grid1.Col = I
Grid1.Text = Fld(I - 1).Name
Next I
'在網格中填入相應的資料
Ds1.MoveFirst
I = 1
Do While Not Ds1.EOF
Grid1.RowHeight(I) = 300
Grid1.Row = I
Grid1.Col = 0
Grid1.Text = I
For J = 1 To Fld.Count
Grid1.Col = J
MyNum = Ds1.Fields(J - 1).Value
'對記錄的資料類型進行判斷後做相應的處理
If IsNumeric( MyNum ) Or IsDate( MyNum ) Then
Grid1.Text = Str$( Ds1.Fields(J - 1).Value )
Else If VarType( MyNum ) = 8 Then
Grid1.Text = Ds1.Fields(J - 1).Value
Else If VarType( MyNum ) = 0 Or VarType( MyNum ) = 1 Then
Grid1.Text = " "
End If
On Error Resume Next
Next J
Ds1.MoveNext
I = I + 1
Loop
Ds1.Close
Db1.Close
Exit Sub

最後應記住,在VB的資料庫應用程式運行之前,一定要在AUTOEXEC.BAT檔案中加入一句SHARE.EXE /L:500。

以上所有程式均在Pentium/166機、中文Windows95下用VB4調試通過。

四、結束語

對非Access資料庫的相容是VB資料庫編程中不可分割的重要部分。因而熟練掌握使用DAO方法對非ACCESS資料庫的編程是極為重要的。並且,一定編程技巧的應用也有助於彌補VB對外來資料庫支援的不足。



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。