【发布时间】: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