top
Loading...
多客戶環境下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過程,修改“電話”字段的內容。
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗