国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

VB5.0中遠(yuǎn)程數(shù)據(jù)庫的訪問

2019-11-18 17:47:09
字體:
供稿:網(wǎng)友
----在VB5.0中,用MicrosoftJet數(shù)據(jù)庫引擎和數(shù)據(jù)訪問對(duì)象DAO(DataaccessObject)可以創(chuàng)建功能強(qiáng)大的客戶/服務(wù)器應(yīng)用程序。對(duì)遠(yuǎn)程數(shù)據(jù)庫的訪問是開發(fā)這類應(yīng)用程序的關(guān)鍵環(huán)節(jié),本文將介紹在VB5.0中用DAO通過MiscrosoftJet數(shù)據(jù)庫引擎訪問遠(yuǎn)程數(shù)據(jù)庫的方法。

----用DAO訪問遠(yuǎn)程數(shù)據(jù)庫大體上可以通過三步來實(shí)現(xiàn),即數(shù)據(jù)連接、數(shù)據(jù)處理和斷開連接。下面主要介紹數(shù)據(jù)連接和數(shù)據(jù)處理的具體操作。

----一、數(shù)據(jù)連接

----DAO一般通過鏈接遠(yuǎn)程表的方式來進(jìn)行數(shù)據(jù)連接。這樣,數(shù)據(jù)雖然駐留在遠(yuǎn)程數(shù)據(jù)源上,但在本地的MicrosoftJet數(shù)據(jù)庫中可以存儲(chǔ)與遠(yuǎn)程數(shù)據(jù)的永久性連接,同時(shí)緩存鏈接的表結(jié)構(gòu)信息,從而在下一次訪問該表時(shí),不用再次從服務(wù)器中檢索這些結(jié)構(gòu)信息,加快了連接速度。一旦鏈接了一個(gè)表,該鏈接便會(huì)保留在各會(huì)話期間,直到連接斷開。鏈接遠(yuǎn)程表的具體操作是:

用OpenDatabase方法打開將要包含該鏈接的本地MicrosoftJet數(shù)據(jù)庫

用CreateTableDef方法在該數(shù)據(jù)庫中創(chuàng)建一個(gè)新的TableDef對(duì)象

將TableDef對(duì)象的Connect屬性設(shè)置為一個(gè)合法的連接字符串,標(biāo)識(shí)要訪問的遠(yuǎn)程數(shù)據(jù)庫類型、數(shù)據(jù)文件的路徑以及用戶名和遠(yuǎn)程數(shù)據(jù)源密碼等。

將TableDef對(duì)象的SourceTableName屬性設(shè)置為遠(yuǎn)程數(shù)據(jù)庫中要訪問的表的名稱。

添加TableDef對(duì)象到TableDefs集合中。
----  實(shí)現(xiàn)鏈接遠(yuǎn)程表操作的過程如下:

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)'鏈接遠(yuǎn)程表
linkTdf.Connect=";database=" strCn
linkTdf.SourceTableName=strTdf
dbs.TableDefs.AppendlinkTdf
EndSub

----上述過程用來實(shí)現(xiàn)遠(yuǎn)程表的連接,它有5個(gè)參數(shù),其中strRoDB是要訪問的遠(yuǎn)程數(shù)據(jù)庫名(包括路徑);strTdf是該數(shù)據(jù)庫中的表名;strDB是要鏈接的本地?cái)?shù)據(jù)庫(包括路徑);linkTdfName是本地?cái)?shù)據(jù)庫的一個(gè)新表名,用來建立遠(yuǎn)程表的鏈接;strCn是指定連接信息的字符串。需要特別注意的是,除了在訪問遠(yuǎn)程MicrosoftJet數(shù)據(jù)庫時(shí),連接字符串要以分號(hào)(;)開頭外,指定連接信息的字符串都必須以所訪問的遠(yuǎn)程數(shù)據(jù)庫類型開頭。DAO可以訪問的遠(yuǎn)程數(shù)據(jù)源有以下三類:

MicrosoftJet數(shù)據(jù)源,如:Access數(shù)據(jù)。

IISAM(可安裝的索引化順序訪問方法)格式數(shù)據(jù)源,如:FoxPRo、Paradox、dBASE數(shù)據(jù)。

ODBC數(shù)據(jù)源,如:SQLServer數(shù)據(jù)、Oracle數(shù)據(jù)。
----例如:設(shè)網(wǎng)絡(luò)服務(wù)器名為server,共享目錄為C:/Sales的FoxPro3.0數(shù)據(jù)庫,連接字符串應(yīng)為

----strCn="FoxPro3.0;database=//server/c$/Sales/Region1"

----此外,DAO通過MicrosoftJet數(shù)據(jù)庫引擎訪問遠(yuǎn)程數(shù)據(jù)時(shí),還可以用OpenDatabase方法直接打開遠(yuǎn)程表。在本地?cái)?shù)據(jù)庫中并未存儲(chǔ)與遠(yuǎn)程數(shù)據(jù)源建立連接所需要的信息。如果使用鏈接方式訪問數(shù)據(jù),則不必在每次會(huì)話開始時(shí)提供連接信息,從而可以提高效率。

----二、數(shù)據(jù)處理

----數(shù)據(jù)連接建立后,可以用OpenRecordset方法打開一個(gè)記錄集,并可用DBGrid控件和Data控件方便地瀏覽整個(gè)記錄集。如果使用表類型(Table-type)記錄對(duì)象,則對(duì)應(yīng)的是一個(gè)實(shí)際存在的數(shù)據(jù)庫表,在多用戶環(huán)境下,其它用戶對(duì)數(shù)據(jù)的修改會(huì)立即反映到表中;如果使用動(dòng)態(tài)集類型(Dynaset-type)記錄對(duì)象,則對(duì)應(yīng)的既可以是一個(gè)表中全部記錄,又可以是一個(gè)查詢的結(jié)果,并且可以更新記錄集中的記錄;如果使用快照類型(Snapshot-type)記錄對(duì)象,則對(duì)應(yīng)的可以是表中的全部記錄,也可以是一個(gè)查詢結(jié)果,但不能進(jìn)行記錄的增加、刪除和修改操作。此外,還可以建立其它類型的記錄對(duì)象,如僅向前型(ForwardOnly-type)記錄對(duì)象和動(dòng)態(tài)型(Dynamic-type)記錄對(duì)象。

----下面是打開動(dòng)態(tài)集記錄對(duì)象并顯示記錄的過程:

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

----上述過程有三個(gè)參數(shù),其中strDB用來指定本地?cái)?shù)據(jù)庫名(包括路徑),linkTdfName是在本地?cái)?shù)據(jù)庫中新建的鏈接遠(yuǎn)程表的表名,strForm是網(wǎng)格控件和數(shù)據(jù)控件所在的窗體名。調(diào)用此過程可以基于新表建立一個(gè)動(dòng)態(tài)集類型的記錄對(duì)象,并可在網(wǎng)格中瀏覽各個(gè)記錄。

----斷開連接可以通過關(guān)閉應(yīng)用程序或設(shè)置連接超時(shí)來實(shí)現(xiàn)。注意:如果對(duì)數(shù)據(jù)庫對(duì)象使用Close方法,則由于在MiscrosoftJet數(shù)據(jù)庫引擎內(nèi)部緩存了連接,實(shí)際上連接并未取消。

----三、應(yīng)用舉例

----以上介紹了用DAO訪問遠(yuǎn)程數(shù)據(jù)庫的具體操作,下面通過一個(gè)例子說明鏈接遠(yuǎn)程表和建立記錄集對(duì)象的方法。

----首先建立一個(gè)新工程,在窗體上畫5個(gè)命令按鈕,1個(gè)數(shù)據(jù)控件和1個(gè)數(shù)據(jù)網(wǎng)格控件(DBGrid),各對(duì)象的屬性設(shè)置見表1。


表1窗體1對(duì)象屬性設(shè)置對(duì)象標(biāo)題(Caption)名稱(Name)
窗體遠(yuǎn)程數(shù)據(jù)訪問Form1
命令按鈕1鏈接遠(yuǎn)程表cmd鏈接
命令按鈕2添加cmdAdd
命令按鈕3刪除cmdDel
命令按鈕4修改cmdModify
命令按鈕5結(jié)束cmdEnd
數(shù)據(jù)控件Data1Data1
數(shù)據(jù)網(wǎng)格DBGrid1

----其中DBGrid1中的DataSource屬性設(shè)為Data1,命令按鈕2,3,4的Visible屬性設(shè)為False。

----編寫如下事件過程:

----

PrivateSubcmdAdd_Click()'添加記錄子過程
OnErrorGoToerrHandler
Withrst
.AddNew
Fori=0To.Fields.Count-1'遍歷記錄集中的每個(gè)字段
'在輸入框中輸入各字段的數(shù)據(jù)
.Fields(i).Value=InputBox
("輸入記錄信息"&vbCr "字段名:" .Fields(i).Name)
Nexti
.Update
EndWith
Data1.Refresh
DBGrid1.ReBind
errHandler:'錯(cuò)誤處理
SelectCaseErr
Case3022,3421
MsgBox(Error vbCr "輸入無效")
ExitSub
CaseElse
Response=0
ExitSub
EndSelect
EndSub

PrivateSubcmdDel_Click()'刪除記錄過程
OnErrorGoToerrHandler
BeginTrans'事務(wù)處理
WithData1.Recordset
If.BOFAnd.EOFThenExitSub'如果沒有記錄,退出過程
.Delete'刪除
If.BOFAnd.EOFThen'如果沒有記錄,退出過程
ExitSub
ElseIf.EOFThen.MoveLast
'如果刪除的是最后一條記錄,光標(biāo)移至最后一記錄
Else:.MoveNext'移至下一條記錄
EndIf
EndWith
IfMsgBox("確實(shí)要?jiǎng)h除這一記錄?",
vbQuestion vbYesNo)=vbYesThen
CommitTrans'確認(rèn)
Data1.Refresh
Else
Rollback'撤消改動(dòng)
Data1.Refresh
EndIf
errHandler:'錯(cuò)誤處理
SelectCaseErr
Case3021'無當(dāng)前記錄
MsgBox("無當(dāng)前記錄,請(qǐng)選擇要?jiǎng)h除的記錄")
ExitSub
CaseElse
MsgBox(Error)
ExitSub
EndSelect
EndSub

PrivateSubcmdEnd_Click()
End'結(jié)束應(yīng)用程序
EndSub

PrivateSubcmdModify_Click()
DBGrid1.AllowUpdate=True'允許修改
EndSub

PrivatevSubcmd鏈接_Click()
Form1.Hide
Form2.Show
EndSub

PrivateSubDBGrid1_After
ColUpdate(ByValColIndexAsInteger)
'數(shù)據(jù)修改后觸發(fā)該事件
OnErrorGoToerr1
Data1.Refresh
err1:
SelectCaseErr
Case0
Response=0
CaseElse
ExitSub
EndSelect
EndSub

PrivateSubDBGrid1_BeforeColUpdate(ByVal
ColIndexAsInteger,
OldValueAsVariant,CancelAsInteger)
'數(shù)據(jù)修改前觸發(fā)該事件
OnErrorGoToerrHandler:
BeginTrans
IfMsgBox("確實(shí)要修改這一內(nèi)容?",
vbQuestion vbYesNo)=vbYesThen
CommitTrans
Else
Rollback
Data1.Refresh
EndIf
errHandler:
SelectCaseErr
Case0
Response=0
CaseElse
MsgBox(Error)
ExitSub
EndSelect
EndSub

PrivateSubForm_Load()
'在窗體裝入時(shí),網(wǎng)格中的數(shù)據(jù)不可添加,修改
DBGrid1.AllowAddNew=False
DBGrid1.AllowUpdate=False
EndSub

PrivateSubForm_Resize()
OnErrorResumeNext
'當(dāng)窗體調(diào)整時(shí)會(huì)調(diào)整網(wǎng)格
DBGrid1.Height=Me.ScaleHeight
-Data1.Height-cmd刪除.Height-30
EndSub

----在工程中添加一個(gè)窗體,在窗體上畫6個(gè)標(biāo)簽,1個(gè)命令按鈕(標(biāo)題為"確認(rèn)",名稱為cmd確認(rèn)),3個(gè)文本框和1個(gè)組合框在窗體的聲明部份輸入以下代碼:

----'聲明窗體層變量

DimrodbsAsDatabase
DimstrDBAsString,strRoDB
AsString,strCnAsString,strTdfAsString
DimlinkTdfNameAsString

編寫如下事件過程:
PrivateSubcmd確認(rèn)_Click()
OnErrorGoToerrHandler:
strDB=text2.Text'本地?cái)?shù)據(jù)庫名及路徑
linkTdfName=Text3.Text
'本地?cái)?shù)據(jù)庫中新建的鏈接遠(yuǎn)程表的表名

strCn=strRoDB'連接字符串
strTdf=Combo1.Text
'指定遠(yuǎn)程數(shù)據(jù)庫中要訪問的表
'調(diào)用LinkTable過程
CallLinkTable(strDB,
strRoDB,strCn,strTdf,linkTdfName)
'調(diào)用rst_display過程
Callrst_display(strDB,linkTdfName,Form1)
Form2.Hide
Form1.Show
Form1.Caption=
"遠(yuǎn)程數(shù)據(jù):" 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
'指定遠(yuǎn)程數(shù)據(jù)庫名及路徑
Setrodbs=OpenDatabase(strRoDB)
'打開遠(yuǎn)程數(shù)據(jù)庫
'刪除combo1中的內(nèi)容
IfCombo1.ListCount>=1Then
Fori=Combo1.ListCount-1To0Step-1
Combo1.RemoveItemi
Nexti
EndIf
'把數(shù)據(jù)庫中的表名加到combo1中
Fori=0Torodbs.TableDefs.Count-1
Combo1.AddItemrodbs.TableDefs(i).Name
Nexti
EndSub->


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 英吉沙县| 南丰县| 峡江县| 洪洞县| 永清县| 休宁县| 永定县| 古田县| 玉溪市| 双峰县| 交城县| 麻栗坡县| 肃宁县| 玉田县| 武义县| 磐安县| 衡水市| 韶山市| 缙云县| 宣武区| 进贤县| 永修县| 青铜峡市| 长治县| 子长县| 苍南县| 渝中区| 嘉荫县| 濉溪县| 大名县| 西乌珠穆沁旗| 瓮安县| 昔阳县| 巴彦淖尔市| 江北区| 南城县| 贵州省| 临汾市| 安义县| 夹江县| 本溪|