問題二再查詢與事務
1.再查詢數據
在多用戶應用程序中,如果以可視的形式把數據顯示在窗口中,則需要用最新的數據來更新用戶的視圖。而要獲得由其他用戶修改了的最新視圖,應用程序必須顯式地對數據執行再查詢操作。為了獲得記錄集中數據的最新視圖,首先應確定記錄集是否支持Requery方法。如果ReCordset對象的Restartable屬性值為Tme,則可以使用Requery方法來刷新Recordset對象的內容。如果記錄集不支持Requery方法,則必須用OpenRecordset方法再次打開記錄集。一般說來,重新打開記錄集比使用Requery方法要慢一些。下面這個過程,用來測試一個記錄集是否可執行再查詢。
過程如下:
FunctionRequeryRecordset(dbsAsDatabase,rstAsRecordset)AsInteger
OnErrorResumeNext
'能夠再查詢記錄集嗎?
Ifrst.Restartable=FalseThen
requeryRecordset=-1
EXitFunction
Endlf
rst.Requery'再查詢記錄集
SelectCaseErr'處理所有錯誤
Case0
RequeryReCordset=0
EXitFunction
CaseElse
Err=0
'重新打開記錄集
'使用rstNane來獲取SQL
'字符串、表或QueryDef的值
'記錄集最初是基於它們的
Setrst=dbs.OpenRecordset(rst.Name,rst.Type)
SelectCaseErr
Case0
RequeryRecordset=0
EXitFunction
CaseElse
'不返回錯誤給調用程序
Err=0
RequeryRecordset=-l
EXitFUnctlon
EndSelect
EndSelect
EndFunction
用上面的過程可以再查詢一個指定的記錄集。如果再查詢成功,則過程返回0;如果程序不能對記錄集進行再查詢,則重新打開記錄集。如果不能重新打開記錄集,則過程返回-1。該過程有兩個參數,其中參數dbs是一個數據庫對象;而rst是一個Recordset對象。為了調用上面的過程,可以在窗體上畫一個命令按鈕,然後編寫如下的事件過程:
PrivateSubCommand1_CliCk()
DimMvdbsAsDatabase
DimMvTabAsRecordset
SetMydbs=OPenDatabase("c:dbdirdb1.mdb",dbOpenDynaset)
SetMyTab=Mydbs.OpenRecordset("Tabel1",dbOpenTable)
a=RequeryReCordset(Mydbs,MyTab)
Ifa=0Then
MsgBox"再查詢成功"
ElSe
MsgBox"不能執行再查詢"
Endif
EndSub
程序運行後,單擊命令按鈕,將調用上面的過程,然後根據具體情況顯示相應的信息框。在一般情況下,大多數Recordset對象是可重啟動的(或者是可以被再查詢的),但基於傳遞查詢和沒有固定列寬的交叉表查詢的Recordset對象例外,不能再查詢這些類型的Recordset對象,為了獲得數據的最新狀態,必須重新打開這些對象。
2.在多用戶環境中使用事務
可以用MicrosoftJet事務把更新劃分為多個單元,使它能夠被當作整體提交或回退。由於事務緩沖區的更新是臨時文件,而不是實際的表,所以它們在多用戶環境中也是有用的。在多用戶環境中,事務的一般用途是:確保用戶在變更共享數據時,所看到的共享數據的視圖是完整的。例如,假定應用程序正在執行更新數據的代碼,而另一個用戶又正在生成相同數據的報表。如果更新沒有被包裝進事務中,則生成報表的用戶接收到的數據可能是不一致的。而如果把更新包裝進事務中,則可以確保共享數據的其它用戶視圖在代碼結束運行之前不會受到代碼的影響。注意,不要使事務保持打開的時間太長。由於編輯事務而產生的所有鎖定,在事務被提交或回退之前,將保持鎖定狀態,這可能會對應用程序的多用戶並發產生有害的影響。->