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 中返回 835 条记录的查询会在 VBA 代码中返回一个空记录集?
MS Access 2013 从 VBA 调用插入查询并出现奇怪的错误
将完整的 ADO 记录集插入现有的 ACCESS 表而不使用循环