总结一下我的设置,我使用带有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
答案 0 :(得分:0)
尝试更改记录集输入和选项枚举。
Set oRS = oQryDef.OpenRecordset(dbOpenDynaset, dbSeeChanges)
'dbOpenDynaset = 2
'dbSeeChanges = 512