Access 2013 - VBA - Recordset插入获取ID

时间:2015-07-06 14:19:32

标签: mysql vba ms-access access-vba

之前已经提出过类似的问题,我已经做了很多搜索,但没有找到合适的解决方案。

上下文:我有一个访问数据库,其中包含大量用于处理按钮按下,表单等的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

不必编辑代码将是一个巨大的奖励,因为这是一个大型数据库,其中包含许多依赖于此的插入语句。

1 个答案:

答案 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")),如果你真的很肛门。