之前曾问过类似的问题,我做了很多搜索,但没有找到合适的解决方案。
上下文:我有一个访问数据库,其中包含许多用于处理按钮按下,表单等的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
-Access 2013
-ODBC驱动程序版本5.3 Server-MySQL 5.5-Ubuntu 14.01.1
在Access上针对链接表的配置中启用了SQL_AUTO_IS_NULL
不必编辑代码将是一个巨大的好处,因为这是一个大型数据库,许多插入语句都依赖于此。
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(Now + TimeValue(“ 0:00:01”))。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句