總結我的設置,我使用帶有Access數據庫(accdb)後端的Excel/VBA前端。前端有許多使用VBA來讀寫數據庫的GUI。當應用程序啓動時,它使用ACE DAO打開數據庫,並且在用戶關閉應用程序之前,此「連接」保持打開狀態。Excel到訪問(ACE DAO) - 如何手動刷新寫入緩存
我遇到的問題是更新記錄不會立即顯示給其他用戶。我相信這是因爲記錄的更新/更改被緩存而不是立即寫入。我發現清除緩存並應用更改的唯一方法是關閉連接。
關閉連接並不是一個真正的選擇,因爲它需要經常進行(我需要不斷重新連接,這需要花費時間)。我目前使用的精簡代碼:
打開數據庫:
Set oDB = DBEngine.OpenDatabase(TARGET_DB, False, False, "MS Access;PWD=" & TARGET_DB_PASS)
我用的是Access數據庫中查詢定義檢索的記錄。一旦我有權利DAO.QueryDef,我叫下面進入記錄:
Set oRS = oQryDef.OpenRecordset
我再修改我想改變,調用.Update和關閉記錄的字段:
With oRS
.Edit
.Fields("Record_Locked") = True
.Fields("Locked_By") = UCase(Environ("username"))
.Fields("Locked_Date") = Now
.Update
.Close
End With
此時,在調用oDB.Close之前,不會對數據庫進行更改。
我迄今爲止嘗試:
明確打開記錄作爲dbDynatset與dbSeeChanges
Set oRS = oQryDef.OpenRecordset(dbOpenDynaset, dbSeeChanges)
把變化領域事務內使用CommitTrans與dbForceOSFlush
DBEngine.BeginTrans
With oRS
.Edit
.Fields("Record_Locked") = True
.Fields("Locked_By") = UCase(Environ("username"))
.Fields("Locked_Date") = Now
.Update
.Close
End With
DBEngine.CommitTrans dbForceOSFlush
當您打開記錄集時,您沒有指定Recordset類型或鎖定類型。你有沒有試過明確要求'dbOpenDynaset'類型? – ThunderFrame
@ThunderFrame,它似乎是默認'dbOpenDynaset'(我檢查了oRS.Type等於2)。 – Boerdom
您沒有看到Access數據庫或Excel前端中的更改嗎?對於只在創建GUI時纔讀取數據庫的前端,或者甚至創建快照類型的RS,這可能是一個問題。 –