【问题标题】:Excel to Access (ACE DAO) - How to flush write cache manuallyExcel to Access (ACE DAO) - 如何手动刷新写入缓存
【发布时间】:2017-06-06 00:53:10
【问题描述】:

总结一下我的设置,我使用的是 Excel/VBA 前端和 Access 数据库 (accdb) 后端。前端有许多使用 VBA 读取/写入数据库的 GUI。应用程序启动时,它使用 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 之前不会对数据库进行更改。

到目前为止我所做的尝试:

使用 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 

【问题讨论】:

  • 您在打开 Recordset 时没有指定 Recordset 类型或锁定类型。您是否尝试过明确请求 dbOpenDynaset 类型?
  • @ThunderFrame,它似乎默认为dbOpenDynaset(我检查了 oRS.Type 等于 2)。
  • 您没有看到 Access 数据库或 Excel 前端的变化吗?这很可能是前端在创建 GUI 时只读取数据库,甚至创建快照类型 RS 的问题。
  • @ErikvonAsmuth 我没有看到访问数据库本身的变化。我的测试方法是使用前端进行更改,并在进行更改后在单独的机器上打开访问数据库。目前,在前端与数据库断开连接之前,访问数据库不会反映更改。似乎修改日期也只有在数据库连接断开后才会更改。
  • 你可能会觉得this answer很有趣。

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


【解决方案1】:

尝试更改记录集 TypeOptions 枚举。

Set oRS = oQryDef.OpenRecordset(dbOpenDynaset, dbSeeChanges)

'dbOpenDynaset = 2
'dbSeeChanges = 512

【讨论】:

  • 不幸的是没有运气。当前端更新记录时,更改似乎仍然没有应用于数据库,直到连接本身关闭(我正在通过在更改完成后在另一台机器上打开数据库进行测试,但连接仍然打开)。在连接关闭之前,数据库的修改日期也不会改变。
猜你喜欢
  • 1970-01-01
  • 2015-11-25
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 2010-09-10
  • 1970-01-01
相关资源
最近更新 更多