Access 2013 - VBA - 记录集插入获取 ID

Posted

技术标签:

【中文标题】Access 2013 - VBA - 记录集插入获取 ID【英文标题】:Access 2013 - VBA - Recordset Insert getting ID 【发布时间】:2015-07-06 14:19:32 【问题描述】:

之前有人问过类似的问题,我进行了很多搜索,但没有找到合适的解决方案。

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

系统详情: 客户 - 视窗 7 - 访问 2013 - ODBC 驱动程序版本 5.3 服务器 - MySQL 5.5 - Ubuntu 14.01.1

在 Access 上的链接表的配置中启用 SQL_AUTO_IS_NULL

不必编辑代码将是一个巨大的好处,因为这是一个大型数据库,许多插入语句都依赖于此。

【问题讨论】:

那么,为了澄清,'AwesomeTable'实际上是一个通过Access连接到MySQL的表? 是的 - 更新操作 ID 和 DateField 3 是表中唯一的关键字段吗? ID 是自增字段吗?您是否尝试选择最大 ID,然后向其添加 1? PK是ID,还有很多其他字段; DateField 3 不是键 “记录被删除”究竟是什么时候触发的?当您访问 LastModified 属性或 ID 属性时? 【参考方案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 (Now + TimeValue("0:00:01"))。

【讨论】:

这导致 R.Update 发生错误:错误“3146”:OBDC --call failed 检查 [DateField 3] 的 MySQL 数据类型,并确保您没有其他必填字段。您可能还需要它是 CurrentDb.OpenRecordset("SELECT * FROM [Awesome Table]", dbOpenDynaset)。

以上是关于Access 2013 - VBA - 记录集插入获取 ID的主要内容,如果未能解决你的问题,请参考以下文章

Access 子表单中的字段名称填充了 vba 记录集

为啥在 Access 中返回 835 条记录的查询会在 VBA 代码中返回一个空记录集?

MS Access 2013 从 VBA 调用插入查询并出现奇怪的错误

将完整的 ADO 记录集插入现有的 ACCESS 表而不使用循环

使用 VBA 在 Access 2010 中的表单上显示记录集

在 Access VBA 中移动记录集