2017-06-06 93 views
1

總結我的設置,我使用帶有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 
+0

當您打開記錄集時,您沒有指定Recordset類型或鎖定類型。你有沒有試過明確要求'dbOpenDynaset'類型? – ThunderFrame

+0

@ThunderFrame,它似乎是默認'dbOpenDynaset'(我檢查了oRS.Type等於2)。 – Boerdom

+0

您沒有看到Access數據庫或Excel前端中的更改嗎?對於只在創建GUI時纔讀取數據庫的前端,或者甚至創建快照類型的RS,這可能是一個問題。 –

回答

0

嘗試更改記錄集類型選項枚舉。

Set oRS = oQryDef.OpenRecordset(dbOpenDynaset, dbSeeChanges) 

'dbOpenDynaset = 2 
'dbSeeChanges = 512 
+0

不幸的是沒有運氣。當前端更新記錄時,直到連接本身關閉(我通過在另一臺機器上打開數據庫進行測試,但連接仍處於打開狀態時),這些更改似乎仍未應用於數據庫。在連接關閉之前,數據庫的修改日期也不會改變。 – Boerdom