多客戶環境下VB數據庫編程之(4)
記錄集鎖定
用記錄集鎖定可以鎖定Recordset對象基本表,也可以指定只讀或(和)只寫訪問。記錄集鎖定只能應用于表類型和動態集類型的Recordset對象,頁面鎖定(見下一節)不能應用于快照類型和僅向前類型的Recordset對象,因為它們本來就是只讀對象。盡管如此,Microsoft Jet仍提供了共享表讀鎖定和共享表寫鎖定。
(1).打開記錄集。以共享模式打開數據庫之后,可以通過在OpenRecordset方法的oPtions參數中指定不同的選項來實現記錄集鎖定。為了用鎖定打開一個記錄集,可按如下步驟操作:1.)以共享模式打開Recordset對象的數據庫。2.)用OpenRecordset方法打開記錄集,并把Options參數設置為所需要的鎖定方式。3.)當Recordset對象的使用結束時,關閉該對象以釋放所有記錄集級的鎖定。編寫一個Function過程,以獨占方式打開一個表。
Function OpenTableExclusive(dbs As Database,rst As Recordset,strTable As String) As Integer
Set rst=dbs.OpenRecordset(strTable,dbOpenTable,dbDenyRead + dbDenyWrite)
Select Case Err
CaSe 0:
OpenTableExclusive=0
CaSe Else:
OpenTableExclusive=-1
End Select
Err=0
End Function
該過程通過dbDenyWrite 和 dbDenyRead選項常數的組合,以獨占模式打開一個表。如果過程調用成功(返回0),則在Recordset變量被顯式或隱式地關閉之前,其它用戶將不能訪問該表。如果其它用戶已經以獨占模式打開該表,或者發生了一個非預期的錯誤,則該過程返回 -1。為了調用上述過程,可以在窗體上畫一個命令按鈕,然后編寫如下的事件過程:
Private Sub Command1_Click()
Dim a As Integer
Dim MvDbs As Database
Dim MvTabs As Recordset
Set MyDbs=OpenDatabase("C:dbdirdbl.mdb,true)
a=OpenTableExclusive(MyDbs,MyTabs,"Tabel1")
Select Case a
Case 0:
MsgBox "調用成功"
Case Else:
MsgBox "調用出錯"
End Select
End Sub
注意,如果打開一個Recordset對象時沒有指定option:參數值,則Microsoft Jet將使用頁面鎖定。在這種情況下,將以共享模式打開記錄集,并且不禁止其他用戶訪問記錄集中的數據,但它確實鎖定了當前頁中正在編輯的數據。
(2).在打開記錄集時檢查錯誤。和以獨占模式打開數據庫一樣,當對Recordset對象設置鎖定時,如果鎖定失敗,則會產生錯誤。如果某個用戶以禁止其它用戶獲得鎖定的方式打開了一個Recordset對象,則當試圖鎖定該Recordset對象時將會發生最常見的錯誤,即3262,其出錯信息為:“不能鎖定表XXX;當前正被用戶XXX在機器XXX上使用。”。當試圖對不能鎖定的對象使用OpenRecordset方法時,也會產生這個錯誤。