Excel to Access(ACE DAO) - 如何手动刷新写入缓存

时间:2017-06-06 00:53:10

标签: vba ms-access dao jet ms-jet-ace

总结一下我的设置,我使用带有Access数据库(accdb)后端的Excel / VBA前端。前端有许多GUI,它们使用VBA来读/写数据库。当应用程序启动时,它使用ACE DAO打开数据库并且这个连接'在用户关闭应用程序之前保持打开状态。

我遇到的问题是其他用户无法立即看到记录更新。我相信这是因为记录的更新/更改正在缓存而不是立即写入。我发现清除此缓存并应用更改的唯一方法是关闭连接。

关闭连接并不是一个真正的选择,因为它需要经常完成(我需要不断重新连接,这需要时间)。我目前使用的精简代码是:

打开数据库:

Set oDB = DBEngine.OpenDatabase(TARGET_DB, False, False, "MS Access;PWD=" & TARGET_DB_PASS)

我在访问数据库中使用查询定义来检索记录集。一旦我有了正确的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之前,不会对数据库进行更改。

到目前为止我尝试了什么:

使用dbSeeChanges

以dbDynatset显式打开记录集
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 

1 个答案:

答案 0 :(得分:0)

尝试更改记录集输入选项枚举。

Set oRS = oQryDef.OpenRecordset(dbOpenDynaset, dbSeeChanges)

'dbOpenDynaset = 2
'dbSeeChanges = 512