top
Loading...
多客戶環境下VB數據庫編程之(9)

多用戶應用程序中應注意的其它問題(2)

問題二 再查詢與事務

1.再查詢數據

在多用戶應用程序中,如果以可視的形式把數據顯示在窗口中,則需要用最新的數據來更新用戶的視圖。而要獲得由其他用戶修改了的最新視圖,應用程序必須顯式地對數據執行再查詢操作。為了獲得記錄集中數據的最新視圖,首先應確定記錄集是否支持Requery方法。如果ReCordset對象的Restartable屬性值為Tme,則可以使用Requery方法來刷新Recordset對象的內容。如果記錄集不支持Requery方法,則必須用OpenRecordset方法再次打開記錄集。一般說來,重新打開記錄集比使用Requery方法要慢一些。下面這個過程,用來測試一個記錄集是否可執行再查詢。

過程如下:

Function RequeryRecordset(dbs As Database,rst As Recordset) As Integer

On Error Resume Next

'能夠再查詢記錄集嗎?

If rst.Restartable=False Then

requeryRecordset=-1

EXit Function

End lf

rst.Requery '再查詢記錄集

Select Case Err '處理所有錯誤

Case 0

RequeryReCordset=0

EXit Function

Case Else

Err=0

'重新打開記錄集

'使用rstNane來獲取SQL

'字符串、表或QueryDef的值

'記錄集最初是基于它們的

Set rst=dbs.OpenRecordset(rst.Name, rst.Type)

Select Case Err

Case0

RequeryRecordset=0

EXit Function

Case Else

'不返回錯誤給調用程序

Err=0

RequeryRecordset=-l

EXit FUnctlon

End Select

End Select

End Function

用上面的過程可以再查詢一個指定的記錄集。如果再查詢成功,則過程返回0;如果程序不能對記錄集進行再查詢,則重新打開記錄集。如果不能重新打開記錄集,則過程返回-1。該過程有兩個參數,其中參數dbs是一個數據庫對象;而rst是一個Recordset對象。

為了調用上面的過程,可以在窗體上畫一個命令按鈕,然后編寫如下的事件過程:

Private Sub Command1_CliCk()

Dim Mvdbs As Database

Dim MvTab As Recordset

Set Mydbs=OPenDatabase("c:dbdirdb1.mdb",dbOpenDynaset)

Set MyTab=Mydbs.OpenRecordset("Tabel1",dbOpenTable)

a=RequeryReCordset(Mydbs,MyTab)

If a=0 Then

MsgBox "再查詢成功"

ElSe

MsgBox "不能執行再查詢"

End if

End Sub

程序運行后,單擊命令按鈕,將調用上面的過程,然后根據具體情況顯示相應的信息框。在一般情況下,大多數Recordset對象是可重啟動的(或者是可以被再查詢的),但基于傳遞查詢和沒有固定列寬的交叉表查詢的Recordset對象例外,不能再查詢這些類型的Recordset對象,為了獲得數據的最新狀態,必須重新打開這些對象。

2.在多用戶環境中使用事務

可以用Microsoft Jet事務把更新劃分為多個單元,使它能夠被當作整體提交或回退。由于事務緩沖區的更新是臨時文件,而不是實際的表,所以它們在多用戶環境中也是有用的。在多用戶環境中,事務的一般用途是:確保用戶在變更共享數據時,所看到的共享數據的視圖是完整的。例如,假定應用程序正在執行更新數據的代碼,而另一個用戶又正在生成相同數據的報表。如果更新沒有被包裝進事務中,則生成報表的用戶接收到的數據可能是不一致的。而如果把更新包裝進事務中,則可以確保共享數據的其它用戶視圖在代碼結束運行之前不會受到代碼的影響。注意,不要使事務保持打開的時間太長。由于編輯事務而產生的所有鎖定,在事務被提交或回退之前,將保持鎖定狀態,這可能會對應用程序的多用戶并發產生有害的影響。
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗