----在VB5.0中,用MicrosoftJet數據庫引擎和數據訪問對象DAO(DataAccessObject)可以創建功能強大的客戶/服務器應用程序。對遠程數據庫的訪問是開發這類應用程序的關鍵環節,本文將介紹在VB5.0中用DAO通過MiscrosoftJet數據庫引擎訪問遠程數據庫的方法。
----用DAO訪問遠程數據庫大體上可以通過三步來實現,即數據連接、數據處理和斷開連接。下面主要介紹數據連接和數據處理的具體操作。
----一、數據連接
----DAO一般通過鏈接遠程表的方式來進行數據連接。這樣,數據雖然駐留在遠程數據源上,但在本地的MicrosoftJet數據庫中可以存儲與遠程數據的永久性連接,同時緩存鏈接的表結構信息,從而在下一次訪問該表時,不用再次從服務器中檢索這些結構信息,加快了連接速度。一旦鏈接了一個表,該鏈接便會保留在各會話期間,直到連接斷開。鏈接遠程表的具體操作是:
用OpenDatabase方法打開將要包含該鏈接的本地MicrosoftJet數據庫
用CreateTableDef方法在該數據庫中創建一個新的TableDef對象
將TableDef對象的Connect屬性設置為一個合法的連接字符串,標識要訪問的遠程數據庫類型、數據文件的路徑以及用戶名和遠程數據源密碼等。
將TableDef對象的SourceTableName屬性設置為遠程數據庫中要訪問的表的名稱。
添加TableDef對象到TableDefs集合中。
---- 實現鏈接遠程表操作的過程如下:
PublicSubLinkTable(strDBAsString,strRoDBAsString,
strCnAsString,strTdfAsString,_
linkTdfNameAsString)
DimlinkTdfAsNewTableDef
Setdbs=OpenDatabase(strDB)
linkTdf.Name=linkTdfName
100
tempTable=UCase(linkTdf.Name)
Fori=0Todbs.TableDefs.Count-1
IfUCase(dbs.TableDefs(i).Name)=tempTableThen
IfMsgBox(linkTdfName "已存在,是否刪除?",_
vbQuestion vbYesNo)=vbYesThen
dbs.TableDefs.DeletelinkTdf.Name
ExitFor
Else:MsgBox"重新輸入新表名"
linkTdfName=InputBox("新表名")
GoTo100
EndIf
EndIf
Nexti
SetlinkTdf=dbs.CreateTableDef
(linkTdfName) '鏈接遠程表
linkTdf.Connect=";database=" strCn
linkTdf.SourceTableName=strTdf
dbs.TableDefs.AppendlinkTdf
EndSub
----上述過程用來實現遠程表的連接,它有5個參數,其中strRoDB是要訪問的遠程數據庫名(包括路徑);strTdf是該數據庫中的表名;strDB是要鏈接的本地數據庫(包括路徑);linkTdfName是本地數據庫的一個新表名,用來建立遠程表的鏈接;strCn是指定連接信息的字符串。需要特別注意的是,除了在訪問遠程MicrosoftJet數據庫時,連接字符串要以分號(;)開頭外,指定連接信息的字符串都必須以所訪問的遠程數據庫類型開頭。DAO可以訪問的遠程數據源有以下三類:
MicrosoftJet數據源,如:Access數據。
IISAM(可安裝的索引化順序訪問方法)格式數據源,如:FoxPro、Paradox、dBASE數據。
ODBC數據源,如:SQLServer數據、Oracle數據。
----例如:設網絡服務器名為server,共享目錄為C:Sales的FoxPro3.0數據庫,連接字符串應為
----strCn="FoxPro3.0;database=serverc$SalesRegion1"
----此外,DAO通過MicrosoftJet數據庫引擎訪問遠程數據時,還可以用OpenDatabase方法直接打開遠程表。在本地數據庫中並未存儲與遠程數據源建立連接所需要的信息。如果使用鏈接方式訪問數據,則不必在每次會話開始時提供連接信息,從而可以提高效率。
----二、數據處理
----數據連接建立後,可以用OpenRecordset方法打開一個記錄集,並可用DBGrid控件和Data控件方便地浏覽整個記錄集。如果使用表類型(Table-type)記錄對象,則對應的是一個實際存在的數據庫表,在多用戶環境下,其它用戶對數據的修改會立即反映到表中;如果使用動態集類型(Dynaset-type)記錄對象,則對應的既可以是一個表中全部記錄,又可以是一個查詢的結果,並且可以更新記錄集中的記錄;如果使用快照類型(Snapshot-type)記錄對象,則對應的可以是表中的全部記錄,也可以是一個查詢結果,但不能進行記錄的增加、刪除和修改操作。此外,還可以建立其它類型的記錄對象,如僅向前型(ForwardOnly-type)記錄對象和動態型(Dynamic-type)記錄對象。
----下面是打開動態集記錄對象並顯示記錄的過程:
PublicSubrst_display(strDBAsString,
strRstAsString,strFormAsForm)
Setdbs=OpenDatabase(strDB)
Setrst=dbs.OpenRecordset(strRst,dbOpenDynaset)
strForm!Data1.DatabaseName=dbs.Name
strForm!Data1.RecordSource=rst.Name
strForm!Data1.Refresh
strForm!DBGrid1.ReBind
EndSub
----上述過程有三個參數,其中strDB用來指定本地數據庫名(包括路徑),linkTdfName是在本地數據庫中新建的鏈接遠程表的表名,strForm是網格控件和數據控件所在的窗體名。調用此過程可以基於新表建立一個動態集類型的記錄對象,並可在網格中浏覽各個記錄。
----斷開連接可以通過關閉應用程序或設置連接超時來實現。注意:如果對數據庫對象使用Close方法,則由於在MiscrosoftJet數據庫引擎內部緩存了連接,實際上連接並未取消。
----三、應用舉例
----以上介紹了用DAO訪問遠程數據庫的具體操作,下面通過一個例子說明鏈接遠程表和建立記錄集對象的方法。
----首先建立一個新工程,在窗體上畫5個命令按鈕,1個數據控件和1個數據網格控件(DBGrid),各對象的屬性設置見表1。
表1窗體1對象屬性設置對象標題(Caption)名稱(Name)
窗體遠程數據訪問Form1
命令按鈕1鏈接遠程表cmd鏈接
命令按鈕2添加cmdAdd
命令按鈕3刪除cmdDel
命令按鈕4修改cmdModify
命令按鈕5結束cmdEnd
數據控件Data1Data1
數據網格 DBGrid1
----其中DBGrid1中的DataSource屬性設為Data1,命令按鈕2,3,4的Visible屬性設為False。
----編寫如下事件過程:
----
PrivateSubcmdAdd_Click()'添加記錄子過程
OnErrorGoToerrHandler
Withrst
.AddNew
Fori=0To.Fields.Count-1 '遍歷記錄集中的每個字段
'在輸入框中輸入各字段的數據
.Fields(i).Value=InputBox
("輸入記錄信息"&vbCr "字段名:" .Fields(i).Name)
Nexti
.Update
EndWith
Data1.Refresh
DBGrid1.ReBind
errHandler: '錯誤處理
SelectCaseErr
Case3022,3421
MsgBox(Error vbCr "輸入無效")
ExitSub
CaseElse
Response=0
ExitSub
EndSelect
EndSub
PrivateSubcmdDel_Click()'刪除記錄過程
OnErrorGoToerrHandler
BeginTrans '事務處理
WithData1.Recordset
If.BOFAnd.EOFThenExitSub '如果沒有記錄,退出過程
.Delete '刪除
If.BOFAnd.EOFThen '如果沒有記錄,退出過程
ExitSub
ElseIf.EOFThen.MoveLast
'如果刪除的是最後一條記錄,光標移至最後一記錄
Else:.MoveNext '移至下一條記錄
EndIf
EndWith
IfMsgBox("確實要刪除這一記錄?",
vbQuestion vbYesNo)=vbYesThen
CommitTrans '確認
Data1.Refresh
Else
Rollback '撤消改動
Data1.Refresh
EndIf
errHandler: '錯誤處理
SelectCaseErr
Case3021 '無當前記錄
MsgBox("無當前記錄,請選擇要刪除的記錄")
ExitSub
CaseElse
MsgBox(Error)
ExitSub
EndSelect
EndSub
PrivateSubcmdEnd_Click()
End '結束應用程序
EndSub
PrivateSubcmdModify_Click()
DBGrid1.AllowUpdate=True '允許修改
EndSub
PrivatevSubcmd鏈接_Click()
Form1.Hide
Form2.Show
EndSub
PrivateSubDBGrid1_After
ColUpdate(ByValColIndexAsInteger)
'數據修改後觸發該事件
OnErrorGoToerr1
Data1.Refresh
err1:
SelectCaseErr
Case0
Response=0
CaseElse
ExitSub
EndSelect
EndSub
PrivateSubDBGrid1_BeforeColUpdate(ByVal
ColIndexAsInteger,
OldValueAsVariant,CancelAsInteger)
'數據修改前觸發該事件
OnErrorGoToerrHandler:
BeginTrans
IfMsgBox("確實要修改這一內容?",
vbQuestion vbYesNo)=vbYesThen
CommitTrans
Else
Rollback
Data1.Refresh
EndIf
errHandler:
SelectCaseErr
Case0
Response=0
CaseElse
MsgBox(Error)
ExitSub
EndSelect
EndSub
PrivateSubForm_Load()
'在窗體裝入時,網格中的數據不可添加,修改
DBGrid1.AllowAddNew=False
DBGrid1.AllowUpdate=False
EndSub
PrivateSubForm_Resize()
OnErrorResumeNext
'當窗體調整時會調整網格
DBGrid1.Height=Me.ScaleHeight
-Data1.Height-cmd刪除.Height-30
EndSub
----在工程中添加一個窗體,在窗體上畫6個標簽,1個命令按鈕(標題為"確認",名稱為cmd確認),3個文本框和1個組合框在窗體的聲明部份輸入以下代碼:
----'聲明窗體層變量
DimrodbsAsDatabase
DimstrDBAsString,strRoDB
AsString,strCnAsString,strTdfAsString
DimlinkTdfNameAsString
編寫如下事件過程:
PrivateSubcmd確認_Click()
OnErrorGoToerrHandler:
strDB=text2.Text'本地數據庫名及路徑
linkTdfName=Text3.Text
'本地數據庫中新建的鏈接遠程表的表名
strCn=strRoDB'連接字符串
strTdf=Combo1.Text
'指定遠程數據庫中要訪問的表
'調用LinkTable過程
CallLinkTable(strDB,
strRoDB,strCn,strTdf,linkTdfName)
'調用rst_display過程
Callrst_display(strDB,linkTdfName,Form1)
Form2.Hide
Form1.Show
Form1.Caption=
"遠程數據:" strCn "-" strTdf
'顯示"添加","刪除","修改"控件
Form1.cmdAdd.Visible=True
Form1.cmdDel.Visible=True
Form1.cmdModify.Visible=True
errHandler:
SelectCaseErr
Case0
Response=0
CaseElse
MsgBox(Error vbr "重新輸入")
ExitSub
EndSelect
EndSub
PrivateSubCombo1_GotFocus()
strRoDB=text1.Text
'指定遠程數據庫名及路徑
Setrodbs=OpenDatabase(strRoDB)
'打開遠程數據庫
'刪除combo1中的內容
IfCombo1.ListCount>=1Then
Fori=Combo1.ListCount-1To0Step-1
Combo1.RemoveItemi
Nexti
EndIf
'把數據庫中的表名加到combo1中
Fori=0Torodbs.TableDefs.Count-1
Combo1.AddItemrodbs.TableDefs(i).Name
Nexti
EndSub->