之前已经提出过类似的问题,我已经做了很多搜索,但没有找到合适的解决方案。
上下文:我有一个访问数据库,其中包含大量用于处理按钮按下,表单等的VBA。数据库是一个多用户系统,之前的SharePoint列表用于在两者之间同步数据所有不同的实例。
我们已经从SharePoint迁移到MySQL数据库,因为我们打算将其他应用程序与不能很好地与SharePoint一起使用的数据库集成。
注意:这不是此代码出现的唯一时间。因此,能够全局修复它而不是实现存储过程等是更可取的:
守则:
Private Sub Command102_Click()
Dim myID As Long
Dim R As Recordset
Set R = CurrentDb.OpenRecordset("SELECT * FROM `Awesome Table`") 'An Access Linked Table
R.AddNew
R![DateField 3] = Now
R.Update
R.Bookmark = R.LastModified
myID = R!ID ' Causes Error
R.Close
Set R = Nothing
DoCmd.OpenForm "awesomeForm", acNormal, , "[ID] = " & myID, acFormEdit
End Sub
错误:
运行时错误' 3167':记录已删除
Access似乎没有提交插入记录并正确获取新ID。
系统详细信息:
客户
- Windows 7
- 访问2013年
- ODBC驱动程序版本5.3
服务器
- MySQL 5.5
- Ubuntu 14.01.1
在Access的链接表的配置中启用了SQL_AUTO_IS_NULL
不必编辑代码将是一个巨大的奖励,因为这是一个大型数据库,其中包含许多依赖于此的插入语句。
答案 0 :(得分:1)
Private Sub Command102_Click()
Dim myID As Long
Dim R As Recordset
Dim dtNow as variant
Set R = CurrentDb.OpenRecordset("SELECT * FROM [Awesome Table]", dbOpenDynaset) 'Jet doesn't like tick marks.
R.AddNew
dtNow = Now()
R![DateField 3] = dtNow
R.Update
'R.Bookmark = R.LastModified
R.Close
Set R = Nothing
DoCmd.OpenForm "awesomeForm", acNormal, , "[DateField 3] = #" & dtNow & "#", acFormEdit
EndSub
Now()也返回秒,因此碰撞的可能性很小 - 尽管如果您处于高吞吐量多用户环境中,这可能是一个问题。但即使这样也可以通过使[Datefield 3]成为一个唯一的值字段并简单地循环直到.AddNew成功来减轻。你可以添加一个Application.Wait(现在+ TimeValue(" 0:00:01")),如果你真的很肛门。