《VB數(shù)據(jù)庫(kù)存取》word版_第1頁(yè)
《VB數(shù)據(jù)庫(kù)存取》word版_第2頁(yè)
《VB數(shù)據(jù)庫(kù)存取》word版_第3頁(yè)
《VB數(shù)據(jù)庫(kù)存取》word版_第4頁(yè)
《VB數(shù)據(jù)庫(kù)存取》word版_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.VB數(shù)據(jù)庫(kù)存取多客戶環(huán)境下VB數(shù)據(jù)庫(kù)編程之1.多客戶環(huán)境下數(shù)據(jù)庫(kù)的儲(chǔ)存方式。在客戶/效勞器系統(tǒng)中,應(yīng)用程序一般分為兩種情況:一種是把整個(gè)應(yīng)用程序放到網(wǎng)絡(luò)效勞器上,允許多個(gè)用戶翻開數(shù)據(jù)庫(kù)。在這種情況下,用戶可以共享組成應(yīng)用程序的所有數(shù)據(jù)庫(kù)對(duì)象,包括存儲(chǔ)數(shù)據(jù)的表。另一種是把應(yīng)用程序分為兩個(gè)數(shù)據(jù)庫(kù)雙數(shù)據(jù)庫(kù):一個(gè)是包括應(yīng)用程序數(shù)據(jù)表的后端數(shù)據(jù)庫(kù),另一個(gè)是包含應(yīng)用程序其它對(duì)象查詢、窗體、報(bào)表、宏和模塊的前端數(shù)據(jù)庫(kù),前端數(shù)據(jù)庫(kù)還可以管理臨時(shí)對(duì)象。后端數(shù)據(jù)庫(kù)放到網(wǎng)絡(luò)效勞器上,而前端數(shù)據(jù)庫(kù)分發(fā)給用戶,使來(lái)自后端數(shù)據(jù)庫(kù)的連接表作為前端數(shù)據(jù)庫(kù)對(duì)象的根底。在多用戶環(huán)境中,雙數(shù)據(jù)庫(kù)方法具有較為明顯的優(yōu)勢(shì),因?yàn)閼?yīng)用程

2、序不必建立可可能與另一個(gè)用戶發(fā)生沖突的臨時(shí)表。因此,在用戶工作站上存儲(chǔ)前端數(shù)據(jù)庫(kù),可以防止對(duì)臨時(shí)對(duì)象的爭(zhēng)用;同時(shí),由于在本地存儲(chǔ)靜態(tài)對(duì)象,因此當(dāng)應(yīng)用程序運(yùn)行時(shí),可以使網(wǎng)絡(luò)通信量減少到最小。2.靜態(tài)部件與動(dòng)態(tài)部件。應(yīng)用程序中的部件可以歸為兩類,即靜態(tài)部件和動(dòng)態(tài)部件。1靜態(tài)部件:應(yīng)用程序中相對(duì)穩(wěn)定,即不經(jīng)常改變的部分。常用的靜態(tài)部件是組成調(diào)用Microsoft Jet宿主程序的動(dòng)態(tài)鏈接庫(kù).dll和可執(zhí)行文件.exe,例如Visual Basic,Microsoft Access,Microsoft Excel等。此外,應(yīng)用程序中的部件,如窗體、報(bào)表和程序代碼等,也屬于靜態(tài)部件。靜態(tài)部件不經(jīng)常改變,

3、因此是工作站存儲(chǔ)的理想選擇。為了獲得最正確性能,通常把靜態(tài)對(duì)象安裝在本地工作站上。這種情況下,當(dāng)應(yīng)用程序的設(shè)計(jì)變更時(shí),必須對(duì)本地工作站上的對(duì)象進(jìn)展更新。但是,假設(shè)用戶工作站的磁盤空間不夠用,或者希望能更好地控制靜態(tài)部件的變更,那么可以把靜態(tài)部件存儲(chǔ)在網(wǎng)絡(luò)效勞器上。這樣做會(huì)明顯增加網(wǎng)絡(luò)的通信量和降低應(yīng)用程序的性能,但可以使應(yīng)用程序更易于管理。當(dāng)然,假設(shè)可能的話,最好把靜態(tài)部件存儲(chǔ)在用戶端。把部件移到工作站上,將會(huì)給應(yīng)用程序的管理帶來(lái)一些費(fèi)事。例如,當(dāng)需要修改應(yīng)用程序的靜態(tài)對(duì)象時(shí),例如修改表的構(gòu)造或程序代碼,必須有相應(yīng)的機(jī)制來(lái)更新每個(gè)工作站上所有受影響的部件。當(dāng)工作站較多時(shí),這種操作相當(dāng)費(fèi)時(shí)費(fèi)力。

4、為理解決個(gè)問(wèn)題,可以使用下兩種方法:·在啟動(dòng)應(yīng)用程序時(shí)檢查部件的最新版本。例如,應(yīng)用程序的啟動(dòng)代碼可以把本地?cái)?shù)據(jù)庫(kù)中靜態(tài)對(duì)象的修改日期與效勞器的中央數(shù)據(jù)庫(kù)中的日期進(jìn)展比較,假設(shè)發(fā)現(xiàn)效勞器對(duì)象的日期較新,那么自動(dòng)輸入對(duì)象的最新版本,使本地?cái)?shù)據(jù)庫(kù)保持最新。·用Microsoft Jet的復(fù)制功能使對(duì)象同步。例如,可以建立數(shù)據(jù)庫(kù)的復(fù)本并把它們存儲(chǔ)在工作站上,然后就可以通過(guò)復(fù)制功能自動(dòng)使對(duì)象同步。"數(shù)據(jù)庫(kù)復(fù)本"在后面將講到。2動(dòng)態(tài)部件:是一些文件,由在多用戶環(huán)境中用戶訪問(wèn)的實(shí)際數(shù)據(jù)組成。這些文件包括Microsoft Jet數(shù)據(jù)庫(kù).mdb文件、外部數(shù)據(jù)庫(kù)文件如M

5、icrosoft FoxPro數(shù)據(jù)庫(kù)文件或存儲(chǔ)在數(shù)據(jù)庫(kù)效勞器上的ODBC數(shù)據(jù)庫(kù)文件。和靜態(tài)部件一樣,應(yīng)用程序動(dòng)態(tài)部件的存放位置同樣可能是決定應(yīng)用程序總體性能的主要因素。例如,假定把應(yīng)用程序的數(shù)據(jù)文件放置在網(wǎng)絡(luò)效勞器上,而且應(yīng)用程序必須在沒有索引的表中查找一個(gè)記錄。在這種情況下,Microsoft Jet必須對(duì)整個(gè)表進(jìn)展順序掃描以查找匹配結(jié)果,這意味著必須把整個(gè)表從效勞器傳送到引擎的工作站。當(dāng)表很大時(shí),這種操作可能需要較長(zhǎng)的時(shí)間。同時(shí),由于用戶在執(zhí)行查找時(shí)長(zhǎng)時(shí)間地等待響應(yīng),而網(wǎng)絡(luò)上大量的通信還會(huì)輪流地降低其他用戶的速度,所以這個(gè)問(wèn)題會(huì)更加復(fù)雜。為了緩解這種情況,可以給應(yīng)用程序要查找的列添加索引。

6、但是,添加索引又可能會(huì)增加網(wǎng)絡(luò)通信量,而且降低了并發(fā)和性能。這就是說(shuō),通過(guò)網(wǎng)絡(luò)訪問(wèn)文件顯然比在本地計(jì)算機(jī)上訪問(wèn)文件慢,在多用戶環(huán)境中實(shí)現(xiàn)數(shù)據(jù)庫(kù)系統(tǒng)實(shí)際上是以犧牲系統(tǒng)性能為代價(jià)的。因此,為了減小網(wǎng)絡(luò)的通信量,最好將某些應(yīng)用程序的部件存儲(chǔ)在本地工作站上。例如,假定應(yīng)用程序使用一套存儲(chǔ)郵政編碼或零件編號(hào)表,而這些表不經(jīng)常改變,那么可以把它們移到本地工作站上,以防止網(wǎng)絡(luò)訪問(wèn)。3.Microsoft Jet多用戶模型。Microsoft Jet多用戶數(shù)據(jù)庫(kù)應(yīng)用程序由幾個(gè)重要部件構(gòu)成。在每個(gè)用戶的工作站上都有Microsoft Jet的一個(gè)拷貝在運(yùn)行,假設(shè)使用雙數(shù)據(jù)庫(kù)方法,那么通常靜態(tài)部件會(huì)駐留在每個(gè)用戶

7、的計(jì)算機(jī)上,而動(dòng)態(tài)部件會(huì)駐留在網(wǎng)絡(luò)效勞器上。除此之外,多用戶應(yīng)用程序具有以下文件:一個(gè)工作組信息文件,它可以集中駐留在網(wǎng)絡(luò)效勞器上,也可以駐留在每個(gè)用戶工作站上;每個(gè)數(shù)據(jù)庫(kù)有一個(gè)鎖定信息文件.1db,它駐留在與數(shù)據(jù)庫(kù)一樣的文件夾內(nèi)。1.工作組信息文件工作組信息文件是一個(gè)Microsoft Jet數(shù)據(jù)庫(kù),用來(lái)存儲(chǔ)用戶、組和密碼信息以及用戶設(shè)置的各種選項(xiàng)信息。在多用戶環(huán)境中,工作組信息文件的位置是很重要的??梢园压ぷ鹘M信息文件放在每個(gè)本地工作站上,也可以把它放在網(wǎng)絡(luò)效勞器上。假設(shè)把它存儲(chǔ)在本地機(jī)上,那么必須在變更平安性設(shè)置值時(shí)采取必要的步驟對(duì)它進(jìn)展更新。2.鎖定信息文件鎖定信息文件.1db用來(lái)存儲(chǔ)

8、數(shù)據(jù)庫(kù)中所有當(dāng)前鎖定記錄的信息。在翻開數(shù)據(jù)庫(kù)時(shí),假設(shè)鎖定信息文件不存在,那么Microsoft Jet數(shù)據(jù)庫(kù)引擎會(huì)自動(dòng)建立該文件。Microsoft Jet為每個(gè)以共享形式翻開的Microsoft Jet數(shù)據(jù)庫(kù)文件建立一個(gè)鎖定信息文件。該文件與翻開的相應(yīng)數(shù)據(jù)庫(kù)同名,但文件名后綴為.1db。例如,與Northwind.mdb相對(duì)應(yīng)的鎖定信息文件名叫Northwind.1db。鎖定信息文件與數(shù)據(jù)庫(kù)存儲(chǔ)在相伺的文件夾中。在數(shù)據(jù)庫(kù)關(guān)閉時(shí),Microsoft Jet會(huì)刪除.1db文件。在多用戶環(huán)境中,那么在所有用戶都退出應(yīng)用程序時(shí)將其刪除。Microsoft Jet支持以下文件效勞器和點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò):.Mi

9、crosoft WindowsNT和Windows95網(wǎng)絡(luò).Banyan VINES 5.52.DECnet4.1.LANtastic 5.0.Novell NetWare3.x和4.x.OS/2 LAN Manager 2.1和2.2一般來(lái)說(shuō)點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)不能很好的滿足多用戶數(shù)據(jù)庫(kù)系統(tǒng)的要求,大多數(shù)應(yīng)用程序要求運(yùn)行在有專用的文件效勞器的網(wǎng)絡(luò)上。在單用戶環(huán)境中,只有一個(gè)用戶在訪問(wèn)數(shù)據(jù),因此應(yīng)用程序不會(huì)發(fā)生資源懇求沖突。而在多用戶環(huán)境中,當(dāng)用戶訪問(wèn)數(shù)據(jù)時(shí),可能會(huì)發(fā)生沖突。為了管理這些沖突,Microsoft Jet提供了數(shù)據(jù)訪問(wèn)控制和應(yīng)用程序的鎖定效勞,以保證在給定的時(shí)間內(nèi)只有一個(gè)用戶可以訪問(wèn)數(shù)據(jù)。

10、數(shù)據(jù)訪問(wèn)控制用來(lái)對(duì)數(shù)據(jù)庫(kù)的部分或全部進(jìn)展訪問(wèn)限制,通常可分為兩類,一類是用戶限制,另一類是功能限制。用戶限制用來(lái)阻止某些人或只允許某些人查看或修改"敏感"數(shù)據(jù)。例如,在工資系統(tǒng)中,大多數(shù)人可以查看職工的工資,但只有少數(shù)人才有權(quán)修改實(shí)際的工資信息。功能限制只對(duì)程序的某個(gè)部分起作用,而不管用戶是誰(shuí)。例如,在訂單登記系統(tǒng)中,假設(shè)把價(jià)格表設(shè)為只讀形式,那么可防止用戶隨意修改某些工程的價(jià)格。在應(yīng)用程序中,可以通過(guò)程序控制或Microsoft Jet數(shù)據(jù)庫(kù)引擎控制來(lái)處理限制。其中程序控制可以施加于程序自身,而引擎級(jí)控制那么限制了任何試圖訪問(wèn)數(shù)據(jù)庫(kù)信息的程序。1.互斥地使用數(shù)據(jù)庫(kù)。以互斥

11、方式翻開數(shù)據(jù)庫(kù)是對(duì)數(shù)據(jù)訪問(wèn)施加的最大限制,它實(shí)際上是以"獨(dú)占"方式使用數(shù)據(jù)庫(kù)。這種限制可以阻止任何用戶或程序訪問(wèn)正在使用的數(shù)據(jù)庫(kù)中的信息。由于這種方式的限制太大,因此只用于那些影響整個(gè)數(shù)據(jù)庫(kù)的操作,包括:·壓縮數(shù)據(jù)庫(kù)。·更新整個(gè)表例如用UPDATE查詢。·通過(guò)添加表、字段或者索引來(lái)修改數(shù)據(jù)庫(kù)的構(gòu)造。·處理特殊的用戶需求例如傳送審計(jì)信息。在程序代碼中,為了以獨(dú)占方式翻開一個(gè)數(shù)據(jù)庫(kù),必須把OpenDatabase方法的第二個(gè)參數(shù)設(shè)置為True,例如:Dim oldDb As Database Dim oldws As workSpace

12、Set oldDb=oldWs.OpenDatabase"Members.mdb",True,False用上面的代碼翻開數(shù)據(jù)庫(kù)時(shí),假設(shè)該數(shù)據(jù)庫(kù)未被其它用戶使用,那么翻開數(shù)據(jù)庫(kù),這樣直到關(guān)閉之前,該數(shù)據(jù)庫(kù)不會(huì)被其它用戶或程序訪問(wèn);假設(shè)數(shù)據(jù)庫(kù)正在被其它用戶使用,那么返回一個(gè)錯(cuò)誤。2.回絕其它用戶或程序訪問(wèn)指定的表。以獨(dú)占方式翻開數(shù)據(jù)庫(kù)后,可以回絕其它用戶或程序訪問(wèn)整個(gè)數(shù)據(jù)庫(kù)包括數(shù)據(jù)庫(kù)中的每個(gè)表。而對(duì)數(shù)據(jù)訪問(wèn)的一種較輕的限制那么是回絕其它用戶或程序訪問(wèn)由本人程序正在使用的表即記錄集,它實(shí)際上是對(duì)記錄集進(jìn)展鎖定。鎖定記錄集的操作通過(guò)OpenRecordset方法中的Options參

13、數(shù)來(lái)實(shí)現(xiàn)。我們知道,OpenRecordset方法的格式如下:對(duì)象.OpenRecordsettype,OPtlons,lockedits其中的options參數(shù)用來(lái)設(shè)置對(duì)記錄集的鎖定,該參數(shù)可以取多種值,以下兩種值用來(lái)制止其它用戶對(duì)記錄集進(jìn)展讀寫操作:1.制止讀dbDenyReadOpenRecordset方法中的dbDenyRead常量用來(lái)制止其它用戶查看表中的數(shù)據(jù),直到關(guān)閉該表為止。當(dāng)需要更新整個(gè)表中的信息時(shí),可以使用這個(gè)常量。例如:Dim rst as Recordset Set rst=dbs.OpenRecordsetstrTable,dbOpenTable,dbDenyRead2

14、.制止寫dbDenywriteOpenRecordset方法中的dbDenyWrite常量用來(lái)制止其它用戶更新表中的數(shù)據(jù),直到關(guān)閉該表為止。在這種情況下,其它用戶可以查看表中的信息,也可以添加新記錄,但不能對(duì)其進(jìn)展修改。當(dāng)需要向表中插入新記錄而又不想修改現(xiàn)有的記錄時(shí),可以使用這個(gè)常量,它對(duì)表和動(dòng)態(tài)集都有效。例如:Dim rst as Recordset Set rst=dbs.OPenRecordsetstrTable,dbOpenTable,dbDenyWrite用dbDenyRead和dbDenyWrite可以分別制止對(duì)記錄集進(jìn)展讀和寫,假設(shè)既想制止讀,又想制止寫,那么可同時(shí)使用這兩個(gè)常量

15、用"十"號(hào)連接。例如:Dim rst as Recordset Set rst=dbs.OpenRecordsetstrTable,dbOpenTable,dbDenyRead+dbDenyWrite前一節(jié)介紹了對(duì)數(shù)據(jù)訪問(wèn)的一些限制,其中講到了對(duì)表的鎖定。這一節(jié)將進(jìn)一步地談一談如何實(shí)現(xiàn)共享數(shù)據(jù)的鎖定操作。要保護(hù)共享數(shù)據(jù),可以在用戶編輯數(shù)據(jù)時(shí)鎖定它。數(shù)據(jù)被鎖定后,任何用戶都可以讀取它,但僅有一個(gè)用戶可以修改它。Microsoft Jet可以在以下三種不同的級(jí)別上鎖定數(shù)據(jù):·獨(dú)占形式:阻止其他所有用戶訪問(wèn)數(shù)據(jù)庫(kù),這是限制最用記錄集鎖定可以鎖定Recordset對(duì)象根本

16、表,也可以指定只讀或和只寫訪問(wèn)。記錄集鎖定只能應(yīng)用于表類型和動(dòng)態(tài)集類型的Recordset對(duì)象,頁(yè)面鎖定見下一節(jié)不能應(yīng)用于快照類型和僅向前類型的Recordset對(duì)象,因?yàn)樗鼈儽緛?lái)就是只讀對(duì)象。盡管如此,Microsoft Jet仍提供了共享表讀鎖定和共享表寫鎖定。1.翻開記錄集。以共享形式翻開數(shù)據(jù)庫(kù)之后,可以通過(guò)在OpenRecordset方法的oPtions參數(shù)中指定不同的選項(xiàng)來(lái)實(shí)現(xiàn)記錄集鎖定。為了用鎖定翻開一個(gè)記錄集,可按如下步驟操作:1.以共享形式翻開Recordset對(duì)象的數(shù)據(jù)庫(kù)。2.用OpenRecordset方法翻開記錄集,并把Options參數(shù)設(shè)置為所需要的鎖定方式。3.當(dāng)Re

17、cordset對(duì)象的使用完畢時(shí),關(guān)閉該對(duì)象以釋放所有記錄集級(jí)的鎖定。編寫一個(gè)Function過(guò)程,以獨(dú)占方式翻開一個(gè)表。Function OpenTableExclusivedbs As Database,rst As Recordset,strTable As StringAs Integer Set rst=dbs.OpenRecordsetstrTable,dbOpenTable,dbDenyRead+dbDenyWriteSelect Case Err CaSe 0:OpenTableExclusive=0 CaSe Else:OpenTableExclusive=-1 End Sel

18、ect Err=0 End Function該過(guò)程通過(guò)dbDenyWrite和dbDenyRead選項(xiàng)常數(shù)的組合,以獨(dú)占形式翻開一個(gè)表。假設(shè)過(guò)程調(diào)用成功返回0,那么在Recordset變量被顯式或隱式地關(guān)閉之前,其它用戶將不能訪問(wèn)該表。假設(shè)其它用戶已經(jīng)以獨(dú)占形式翻開該表,或者發(fā)生了一個(gè)非預(yù)期的錯(cuò)誤,那么該過(guò)程返回-1。為了調(diào)用上述過(guò)程,可以在窗體上畫一個(gè)命令按鈕,然后編寫如下的事件過(guò)程:Private Sub Command1_ClickDim aAs Integer Dim MvDbs As Database Dim MvTabs As Recordset Set MyDbs=OpenDat

19、abase"C:dbdirdbl.mdb,truea=OpenTableExclusiveMyDbs,MyTabs,"Tabel1"Select Case aCase 0:MsgBox"調(diào)用成功"Case Else:MsgBox"調(diào)用出錯(cuò)"End Select End Sub注意,假設(shè)翻開一個(gè)Recordset對(duì)象時(shí)沒有指定option:參數(shù)值,那么Microsoft Jet將使用頁(yè)面鎖定。在這種情況下,將以共享形式翻開記錄集,并且不制止其他用戶訪問(wèn)記錄集中的數(shù)據(jù),但它確實(shí)鎖定了當(dāng)前頁(yè)中正在編輯的數(shù)據(jù)。2.在翻開記錄集時(shí)檢查

20、錯(cuò)誤。和以獨(dú)占形式翻開數(shù)據(jù)庫(kù)一樣,當(dāng)對(duì)Recordset對(duì)象設(shè)置鎖定時(shí),假設(shè)鎖定失敗,那么會(huì)產(chǎn)生錯(cuò)誤。假設(shè)某個(gè)用戶以制止其它用戶獲得鎖定的方式翻開了一個(gè)Recordset對(duì)象,那么當(dāng)試圖鎖定該Recordset對(duì)象時(shí)將會(huì)發(fā)生最常見的錯(cuò)誤,即3262,其出錯(cuò)信息為:"不能鎖定表XXX;當(dāng)前正被用戶XXX在機(jī)器XXX上使用。"。當(dāng)試圖對(duì)不能鎖定的對(duì)象使用OpenRecordset方法時(shí),也會(huì)產(chǎn)生這個(gè)錯(cuò)誤。從理想的角度來(lái)說(shuō),假設(shè)能對(duì)記錄進(jìn)展鎖定,那么會(huì)給多用戶程序帶來(lái)極大的靈敏性。然而遺憾的是,Microsoft Jet引擎不支持真正的記錄鎖定,而是使用頁(yè)面鎖定。頁(yè)面鎖定只鎖定包

21、含當(dāng)前正在編輯的記錄的頁(yè),Microsoft Jet進(jìn)展訪問(wèn)和鎖定的頁(yè)的大小為2K2048個(gè)字節(jié)。在使用頁(yè)面鎖定時(shí),其他用戶可以讀取鎖定頁(yè)中的數(shù)據(jù),但不能對(duì)數(shù)據(jù)進(jìn)展修改。在這種鎖定方案中,每次將鎖定多個(gè)記錄,鎖定的記錄的個(gè)數(shù)取決于每個(gè)記錄的大小。例如,假設(shè)每個(gè)記錄的長(zhǎng)度為230個(gè)字節(jié),那么每次只能鎖定9個(gè)記錄;而假設(shè)記錄的長(zhǎng)度為30個(gè)字節(jié),那么每次可鎖定68個(gè)記錄。鎖定形式。頁(yè)面鎖定分為兩種形式,即保守式鎖定和開放式鎖定,它確定了Microsoft Jet如何對(duì)數(shù)據(jù)進(jìn)展鎖定。當(dāng)編寫在頁(yè)面級(jí)別上鎖定數(shù)據(jù)的應(yīng)用程序時(shí),必須確定要使用哪種鎖定形式。頁(yè)面鎖定可以通過(guò)兩種方法來(lái)設(shè)置,即LockEdits

22、屬性和OpenRecordset方法中的lockedit5參數(shù)。1.用LockEdits屬性指定鎖定形式。鎖定形式可以通過(guò)LockEdits屬性來(lái)指定。該屬性可用于各種Recordset對(duì)象,包括動(dòng)態(tài)集、快照、表及動(dòng)態(tài)類型的Recordset對(duì)象。LockEdits屬性是一個(gè)布爾值,當(dāng)把該值設(shè)置為True缺省時(shí),將對(duì)記錄集進(jìn)展保守式鎖定,即在執(zhí)行Edit方法時(shí)鎖定2K的頁(yè)面:假設(shè)把該屬性設(shè)置為False,那么對(duì)記錄集進(jìn)展開放式鎖定,即在執(zhí)行UPdate之前不鎖定要更新的記錄所在的2K頁(yè)面。如下面的例子:Dim rstTemP As ReCordsetrstTemp.LockEdits=True

23、說(shuō)明:a.鎖定頁(yè)面后,其它用戶不能對(duì)正在編輯的記錄所在頁(yè)面進(jìn)展修改,但可以讀取鎖定頁(yè)中的數(shù)據(jù)。在其它用戶鎖定頁(yè)面后,假設(shè)再把LockEdits屬性設(shè)置為True,那么會(huì)出錯(cuò)。b.假設(shè)把LockEdits屬性設(shè)置為False,且其它用戶已鎖定頁(yè)面,那么其后的用戶在使用Update時(shí)將會(huì)出錯(cuò)。c.當(dāng)與Microsoft連接的ODBC數(shù)據(jù)源一起操作時(shí),LockEdits屬性被設(shè)置為False,即開放式鎖定。2.用OpenRecordset方法指定鎖定形式。我們已屢次使用過(guò)OpenRecordset方法,該方法的格式如下:Set recordset=object.OpenRecordsettype,o

24、ptions,lockedits其中第三個(gè)參數(shù),即lockedits,用來(lái)指定鎖定形式或以只讀方式翻開記錄集。該參數(shù)可以取以下5種值:1dbReadOnly:以只讀方式翻開記錄集。注意,在options參數(shù)中也可以使用dbReadOnly,但不能同時(shí)使用,否那么會(huì)產(chǎn)生錯(cuò)誤。2dbPessimistic:用保守式鎖定形式翻開記錄集,一旦使用Edit方法,將立即鎖定正在編輯的記錄所在的頁(yè)面,直到執(zhí)行Update方法后才釋放對(duì)該頁(yè)面的鎖定。3dbOptimistic:用保守式鎖定形式翻開記錄集,在執(zhí)行Update方法前不鎖定正在編輯的記錄所在的頁(yè)面。4dbOptimisticValue:基于行值使用

25、開放式并發(fā)僅ODBCDirect工作區(qū)。5dbOptimisticBatch:允許開放式更新僅ODBCDirect工作區(qū)。保守式鎖定和開放式鎖定。1.保守式鎖定。保守式鎖定也稱為悲觀鎖定。設(shè)置保守式鎖定后,只要對(duì)某個(gè)記錄使用Edit方法,就自動(dòng)鎖定該記錄所在的頁(yè)面,直到顯式地提交或取消這個(gè)記錄的變更例如執(zhí)行UPdate方法后,才釋放對(duì)該頁(yè)面的鎖定,并把數(shù)據(jù)寫入文件中。保守式鎖定是Recordset對(duì)象的缺省鎖定方式。保守式鎖定的主要優(yōu)點(diǎn)是,獲得鎖定之后,只要記錄還被鎖定著,就可以防止其它用戶修改該記錄中的數(shù)據(jù),因此不會(huì)發(fā)生任何鎖定沖突。另外,由于一個(gè)用戶不能在另一個(gè)用戶開場(chǎng)編輯記錄之后改變它,

26、所以,保守式鎖定也是保證應(yīng)用程序讀取最新數(shù)據(jù)的唯一方法。保守式鎖定的缺點(diǎn)是,在編輯和鎖定該記錄的過(guò)程中,包含該記錄的整個(gè)頁(yè)面都被鎖定。當(dāng)鎖定時(shí)間較長(zhǎng)時(shí),可能會(huì)給其它用戶造成不必要的費(fèi)事。例如,用戶設(shè)置保守式鎖定后,開場(chǎng)編輯一個(gè)記錄,并在記錄被鎖定期間分開了計(jì)算機(jī)例如出去辦事,這不僅鎖定了用戶正在編輯的記錄,而且鎖定駐留在該鎖定頁(yè)面內(nèi)的其它記錄,使其它用戶長(zhǎng)時(shí)間內(nèi)無(wú)法編輯頁(yè)面中的記錄。2.開放式鎖定。開放式鎖定也稱樂觀鎖定。使用開放式鎖定時(shí),MicrosoftJet引擎僅在試圖用Update方法提交記錄變更時(shí)才鎖定頁(yè)面,完成更新操作后立即釋放對(duì)頁(yè)面的鎖定。由于鎖定僅在應(yīng)用程序試圖提交變更時(shí)發(fā)生,

27、因此能使鎖定的時(shí)間最短,使其它用戶只在鎖定生效的較短時(shí)間內(nèi)不能訪問(wèn)該頁(yè)面。這是開放式鎖定的主要優(yōu)點(diǎn)。開放式鎖定的缺點(diǎn)是:當(dāng)用戶正在編輯記錄時(shí),不能保證更新是否會(huì)成功。假設(shè)另一個(gè)用戶改變了第一個(gè)用戶正在編輯的記錄,那么依賴于開放式鎖定的更新將會(huì)失敗。例如,假定張三和李四正在編輯同一個(gè)記錄,張三開場(chǎng)以開放式鎖定編輯某個(gè)客戶記錄。由于張三使用的是開放式鎖定,并沒有真正鎖定記錄,所以不能制止李四試圖編輯一樣的記錄。在李四編輯一樣的客戶記錄時(shí),他不知道張三正在編輯該記錄,并且也沒有看到最新的數(shù)據(jù)。當(dāng)張三試圖在李四編輯一樣的客戶記錄時(shí)存儲(chǔ)他的變更,就會(huì)產(chǎn)生一個(gè)錯(cuò)誤。對(duì)于大多數(shù)數(shù)據(jù)庫(kù)應(yīng)用程序來(lái)說(shuō),可能要選擇開放式鎖定,因?yàn)槠渌脩粜薷幕騽h除本人正在使用的記錄的可能性要小于試圖訪問(wèn)已被鎖定的頁(yè)面上記錄的可能性。但是,假設(shè)某個(gè)應(yīng)用程序中有多個(gè)用戶同時(shí)訪問(wèn)和編輯記錄,那么應(yīng)使用保守式鎖定,以確保在執(zhí)行編輯期間記錄不被其別人修改。在這種情況下,應(yīng)注意不要使記錄鎖定的時(shí)間過(guò)長(zhǎng)。3.釋放鎖定。如前所述,在執(zhí)行Update方法后,將自動(dòng)釋放頁(yè)面鎖定。但是,釋放記錄鎖定是一種后臺(tái)進(jìn)程,有時(shí)候

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論