程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 共享數據的鎖定--多客戶環境下VB數據庫編程之(3)

共享數據的鎖定--多客戶環境下VB數據庫編程之(3)

編輯:VB綜合教程
前一節介紹了對數據訪問的一些限制,其中講到了對表的鎖定。這一節將進一步地談一談如何實現共享數據的鎖定操作。要保護共享數據,可以在用戶編輯數據時鎖定它。數據被鎖定後,任何用戶都可以讀取它,但僅有一個用戶可以修改它。MicrosoftJet可以在以下三種不同的級別上鎖定數據:
  
  ·獨占模式:阻止其他所有用戶訪問數據庫,這是限制最大的模式,上一節已介紹過。
  ·記錄集鎖定:即鎖定Recordset對象的基本表,用讀表鎖定、寫表鎖定或兩者都用。
  ·頁面鎖定:鎖定含有正在編輯的數據的頁面,其長度為2048個字節(2K)。這是限制最小的模式。
  
  在應用程序中用哪一種模式來鎖定對象,主要看所需要的並發級別。例如,如果想使對象在任何時候都可用,則可使用頁面鎖定,因為它是限制最小的級別。如果應用程序要保證數據庫中的大多數或所有數據都可訪問,則應選擇獨占模式,這種模式確保應用程序獨占數據庫的訪問。注意,這三種級別可以結合使用。例如,假定有一個訂單系統,則可以用頁面鎖定來控制訂單表的鎖定,使訂單接收者之間的並發程度最高。在一天結束時用記錄集鎖定來鎖定匯總表,這個匯總表要用匯總數據來更新。最後,可以在夜間使用獨占模式來整理數據庫。
  
  1.共享模式與獨占模式
  
  如前所述,獨占模式是打開數據庫限制最大的方式,它阻止其他所有用戶打開該數據庫。這種模式常用於數據庫管理或數據庫的批量修改,例如修復或整理操作以及改變數據庫的結構等。在單用戶環境中訪問數據庫時,通常以獨占模式打開數據庫,這可以提供更好的性能,因為MicrosoftJet不必對對象進行鎖定和解鎖,也不必刷新高速緩存器。但是,當在多用戶環境中使用應用程序時,通常以共享模式打開數據庫。
  
  (1).以共享模式打開數據庫
  
  為了實現記錄集鎖定,必須以共享模式打開數據庫。當以共享模式打開數據庫時,可能會有多個用戶同時對數據庫進行訪問,在這種情況下,MicrosoftJet將處理各用戶間試圖編輯相同記錄的沖突。前一節中講過,當用OpenDatabase方法打開數據庫時,只要把Options參數的值設置為False,就能以共享模式打開數據庫。下面舉一個例子。
  
  編寫一個Function過程,調用該過程,可以根據需要用共享模式或獨占模式打開數據庫。過程如下:
  
  FunctionOPenDatabaseX(dbsAsDatabase,strDBPathAsString,blnExclusiveAsBoolean)AsInteger'關閉錯誤捕獲
  
  OnErrorResumeNext'打開strDBPath所指定的數據庫。如果blnExclusive為True,則以獨占模式打開數據庫:否則,以共享模式打開數據庫
  
  Setdbs=OpenDatabase(strDBPath,blnExclusiVe)
  SelectCaseErr
  CaSe0:
  OPenDatabaseX=0
  Case3033:
  OpenDatabaseX=3033
  Case3343:
  OpenDatabaseX=3343
  Case3044:
  OpenDatabaseX=3044
  Case3024:
  OpenDatabaseX=3024
  CaseElse:
  OpenDatabaseX=-l
  EndSelect
  EndFunCtion
  
  該過程以共享模式或獨占模式打開一個數據庫,由參數blnExclusive決定。如果blnExclusive參數為True,則數據庫以獨占模式打開;否則,數據庫以共享模式打開。在該過程中,用錯誤處理程序來檢測錯誤,並根據過程調用的執行情況返回錯誤代碼。該過程有3個參數,分別為數據庫對象變量名、數據庫名(包括路徑)和模式開關。為了調用這個過程,應先用Dim語句聲明一個Database對象變量,然後把這個對象變量和數據庫的名字(strDBPath)一起傳送給OpenDatabaseX過程。在調用OpenDatabaseX的代碼時,應當檢查OpenDatabaseX的返回值,看是否有錯誤發生,然後根據發生的錯誤采取相應的措施。在窗體上畫一個命令按鈕,然後在下面的事件過程中調用過程OpenDatabaseX:
  
  PnvateSubCommandl_Click()
  DimaAsInteger
  DimMvDbsAsDatabase
  a=OpenDatabaseX(MyDbs,"c:Vb50iblio.mdb",False)
  SelectCasea
  Case0:
  MsgBox"調用成功"
  Case3033:
  MsgBoxError(3033)
  Case3343:
  MsgBOxError(3343)
  Case3044:
  MsgBoxEnor(3044)
  Case3024:
  MsgBoxError(3024)
  CaseElse:
  MSgBoxError(3024)
  EndSeleCt
  EndSub
  
  OPenDatabaseX過程的返回值是一個整型數,它是調用時產生的錯誤代碼。當返回值為0時,表示調用成功,顯示一個信息框。上述事件過程以共享方式打開一個數據庫,如果把OpenDatabaseX的第三個參數改為True,則以獨占方式打開該數據庫。如果在調用時出錯,則將返回錯誤代碼,在事件過程中用Error函數顯示相應的信息。例如,假定把數據庫名改為:e:vb50iblio.mdb。則由於該數據庫的路徑不對而出錯,產生出錯信息。
  
  (2).使用只讀模式
  
  只讀模式是共享模式的特殊形式。當以只讀模式打開一個數據庫時,不能改變數據庫的數據或對象。但是,其他用戶可以改變數據,不要把這種模式與在操作系統級以只讀模式打開文件相混淆。下面的代碼以獨占的只讀模式打開一個數據庫:
  SetdbsOrdEntry=OpenDatabase("OrdEntry.mdb",True,True)
  如果以共享的只讀模式打開一個數據庫,則應使用下面的代碼:
  SetdbsOrdEntry=OpenDatabase("OrdEntry.mdb",False,True)
  注意,以只讀模式打開數據庫時,並不禁止共享表類型的鎖定或讀鎖定;因此,以只讀模式打開數據庫不能防止鎖定沖突的發生。限制程序為只讀方式的另一種辦法是為記錄集使用快照,快照類型的記錄集總是只讀的。當基表中的數據不需要經常修改時,可以使用快照。由於快照存放在內存中,因此其操作比使用表或動態集的相同操作速度要快。但是,由於快照的內存需求和裝入內存時要花費一定的時間,最好把快照用於返回記錄在200以內的查詢中。->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved