多客戶環境下VB數據庫編程之(6)
實現頁面鎖定的一個具體例子
實現頁面鎖定時使用開放式鎖定,可按如下步驟操作:
(1)打開一個表類型或動態集類型的記錄集,它就是想要編輯的數據。
(2)把數據指針移動到一個記錄上。
(3)把記錄集的LockEdits屬性設置為False,指定開放式鎖定。
(4)用Edit方法編輯該記錄(該記錄還沒有被鎖定)。
(5)提交該記錄。
(6)用Update方法來提交記錄的變更(這將試圖鎖定記錄)。
(7)檢查Update方法是否成功。如果沒有成功,則再試;
當使用事務時,開放式鎖定將轉換為保守式鎖定。因為在提交事務之前,事務一直擁有寫鎖定,所以即使把LockEdits屬性設置為False,也會轉換為保守式鎖定。
在保守式鎖定中,Update方法可能會失敗。這是因為Edit方法沒有設置寫鎖定,并不意味著Update方法沒有置寫鎖定。換句話說,當一個用戶用保守式鎖定打開記錄集時,即使第二個用戶使用的是開放式鎖定,他對相同數據的更新也會失敗。下面通過一個例子說明如何實現保守式鎖定。編寫一個Function過程,用來實現保守式鎖定,并用該過程更新數據庫。
FUnctionUpdateUnitslnStoCk(strlAsString,Str2AsStnng)
Dim dbs As Database
Dim rstStr As Recordset
Dim blnError As Boolean
Dim intCount As Integer
Dim intLockCount As Integer
Dim intChoiCe As Integer
Dim intRndCount As Integer
Dim i As Integer
OnErrorGoToErrorHandler ’以共享模式打開數據庫
Set dbs=openDatabase(“d:dbtestdbtest.mdb”) ’打開表進行編輯
Set rstStr=dbs.OpenRecordset(”tb”,dbOpenDynaset)
With rstStr
.LockEditS=True ’把鎖定類型設置為保守方式
.FindFirst”電話=” & Chr(34) & strl & Chr(34)
If.NoMatch Then
UpdateUnitslnStock=-l
GoTo CleanExit
End lf
’試圖編輯記錄。如果發生鎖定錯誤,則錯誤處理程序會試著解決它,因為該程序使用的是保守式鎖定,所以當試圖編輯一個記錄時會產生錯誤。如果它使用開放式鎖定,那么就會在更新記錄時產生錯誤
.Edit
![電話]=str2
.Update
End With
CleanExit:
rstStr.Close
dbs.CloSe
EXit Function
ErrorHandler:
Select Case Err
Case 3197
’記錄集中的數據在被打開之后發生了變更,再試一下編輯該記錄,這將自動刷新記錄集,以顯示最新的數據
Resume
Case 3260 '記錄被鎖定
IntLockCount=IntLockCount + 1
’已經兩次試圖獲得鎖定,讓用戶取消或重試
If intLockCount > 2 Then
intChoice=MsgBox(Err.Description & "Retry?",vbYesNo + VbQuestion)
If intChoice=vbYes Then
intLockCount=1
ElSe
UpdateUnitslnStock=ERR_RECORDLOCKED
Resume CleanExit
End lf
End lf
’移交給Windows
DOEVents
’延遲一個較短的隨機時間,每次鎖定失敗后就把這個時間間隔變長一些
intRndCount=intLockCount ^ 2 * Int(Rnd * 3000 + 1000)
For i=1 To intBndCount: Next i
Resume ’再試一次編輯
Case Else '非預期的錯誤
MsgBOX"Error" & Err & ":" & Error, VbOKOnlv
UpdateUnitslnStock=FAILED
ResunleCleanExit
End Select
End FunCtlon
上述過程打開一個數據庫dbtest.mdb,該數據庫中有一個名為tb的表,其內容如圖所示。
姓名 地址 電話 郵政編碼
王春明 西城區 69039026 100089
李新民 西城區 68026097 100079
UpdateUnitslnStock過程有兩個參數,第一個參數是表中指定字段(過程中為“電話”)原來的內容,第二個參數是該字段修改后的內容。過程中用rstStr.LockEdits=True
指定保守式鎖定,接著指定要修改的字段,如果要修改的字段不存在,則過程返回值為 -1,并關閉表和數據庫,退出過程;如果找到了要修改的字段,則用Edit和Update方法對其進行修改和更新。程序的其余部分是錯誤處理子程序,主要用來對可能出現的錯誤進行處理。
為了調用上面的過程,可以在窗體上畫一個命令按鈕,然后編寫如下的事件過程:
Private Sub Command1_Click()
a=UpdateUnitslnStock(”3456.8765”,”2222.3333”)
b=UpdateUnitslnStock(”6845.7651”,”4444.5555”)
c=UPdateUnitslnStock(”6842.2939“,”6666.7777”)
End Sub
運行程序,單擊命令按鈕,即可調用UpdateUnitslnStock過程,修改“電話”字段的內容。
實現頁面鎖定時使用開放式鎖定,可按如下步驟操作:
(1)打開一個表類型或動態集類型的記錄集,它就是想要編輯的數據。
(2)把數據指針移動到一個記錄上。
(3)把記錄集的LockEdits屬性設置為False,指定開放式鎖定。
(4)用Edit方法編輯該記錄(該記錄還沒有被鎖定)。
(5)提交該記錄。
(6)用Update方法來提交記錄的變更(這將試圖鎖定記錄)。
(7)檢查Update方法是否成功。如果沒有成功,則再試;
當使用事務時,開放式鎖定將轉換為保守式鎖定。因為在提交事務之前,事務一直擁有寫鎖定,所以即使把LockEdits屬性設置為False,也會轉換為保守式鎖定。
在保守式鎖定中,Update方法可能會失敗。這是因為Edit方法沒有設置寫鎖定,并不意味著Update方法沒有置寫鎖定。換句話說,當一個用戶用保守式鎖定打開記錄集時,即使第二個用戶使用的是開放式鎖定,他對相同數據的更新也會失敗。下面通過一個例子說明如何實現保守式鎖定。編寫一個Function過程,用來實現保守式鎖定,并用該過程更新數據庫。
FUnctionUpdateUnitslnStoCk(strlAsString,Str2AsStnng)
Dim dbs As Database
Dim rstStr As Recordset
Dim blnError As Boolean
Dim intCount As Integer
Dim intLockCount As Integer
Dim intChoiCe As Integer
Dim intRndCount As Integer
Dim i As Integer
OnErrorGoToErrorHandler ’以共享模式打開數據庫
Set dbs=openDatabase(“d:dbtestdbtest.mdb”) ’打開表進行編輯
Set rstStr=dbs.OpenRecordset(”tb”,dbOpenDynaset)
With rstStr
.LockEditS=True ’把鎖定類型設置為保守方式
.FindFirst”電話=” & Chr(34) & strl & Chr(34)
If.NoMatch Then
UpdateUnitslnStock=-l
GoTo CleanExit
End lf
’試圖編輯記錄。如果發生鎖定錯誤,則錯誤處理程序會試著解決它,因為該程序使用的是保守式鎖定,所以當試圖編輯一個記錄時會產生錯誤。如果它使用開放式鎖定,那么就會在更新記錄時產生錯誤
.Edit
![電話]=str2
.Update
End With
CleanExit:
rstStr.Close
dbs.CloSe
EXit Function
ErrorHandler:
Select Case Err
Case 3197
’記錄集中的數據在被打開之后發生了變更,再試一下編輯該記錄,這將自動刷新記錄集,以顯示最新的數據
Resume
Case 3260 '記錄被鎖定
IntLockCount=IntLockCount + 1
’已經兩次試圖獲得鎖定,讓用戶取消或重試
If intLockCount > 2 Then
intChoice=MsgBox(Err.Description & "Retry?",vbYesNo + VbQuestion)
If intChoice=vbYes Then
intLockCount=1
ElSe
UpdateUnitslnStock=ERR_RECORDLOCKED
Resume CleanExit
End lf
End lf
’移交給Windows
DOEVents
’延遲一個較短的隨機時間,每次鎖定失敗后就把這個時間間隔變長一些
intRndCount=intLockCount ^ 2 * Int(Rnd * 3000 + 1000)
For i=1 To intBndCount: Next i
Resume ’再試一次編輯
Case Else '非預期的錯誤
MsgBOX"Error" & Err & ":" & Error, VbOKOnlv
UpdateUnitslnStock=FAILED
ResunleCleanExit
End Select
End FunCtlon
上述過程打開一個數據庫dbtest.mdb,該數據庫中有一個名為tb的表,其內容如圖所示。
姓名 地址 電話 郵政編碼
王春明 西城區 69039026 100089
李新民 西城區 68026097 100079
UpdateUnitslnStock過程有兩個參數,第一個參數是表中指定字段(過程中為“電話”)原來的內容,第二個參數是該字段修改后的內容。過程中用rstStr.LockEdits=True
指定保守式鎖定,接著指定要修改的字段,如果要修改的字段不存在,則過程返回值為 -1,并關閉表和數據庫,退出過程;如果找到了要修改的字段,則用Edit和Update方法對其進行修改和更新。程序的其余部分是錯誤處理子程序,主要用來對可能出現的錯誤進行處理。
為了調用上面的過程,可以在窗體上畫一個命令按鈕,然后編寫如下的事件過程:
Private Sub Command1_Click()
a=UpdateUnitslnStock(”3456.8765”,”2222.3333”)
b=UpdateUnitslnStock(”6845.7651”,”4444.5555”)
c=UPdateUnitslnStock(”6842.2939“,”6666.7777”)
End Sub
運行程序,單擊命令按鈕,即可調用UpdateUnitslnStock過程,修改“電話”字段的內容。