Access VBA遍历Recordset无法更新:提示Update无AddNew/Edit错误
问题分析与解决:Access VBA Recordset更新报错 'Update or UpdateCancel without addNew or edit'
你编写的Access VBA代码在遍历Recordset更新Start Date字段时触发报错,同时无法完成更新,核心问题在于Recordset编辑流程错误,还有多处细节疏漏,具体分析和修复如下:
错误原因拆解
Edit方法调用顺序完全颠倒
修改Recordset记录的正确逻辑是:先调用.Edit将当前记录切换到编辑模式,再修改字段值。你现在先赋值ourRecordset![Start Date] = JS再调用.Edit,直接违反了Recordset的编辑规则,这是触发报错的直接原因。缺少Update方法保存变更
即便修正了Edit的顺序,没有调用.Update的话,所有字段修改都不会写入数据库,只会停留在内存中,最终丢失。冗余且可能出错的RecordCount赋值
循环内重复赋值RecCnt = ourRecordset.RecordCount毫无意义,且动态游标下RecordCount值可能不准确,属于无效代码。
修复后的完整代码
Dim ourDatabase As Database Dim ourRecordset As Recordset Dim strSQL As String Dim ActvJbNum As Long Dim LpRecCnt As Long Dim JS As Date JS = Now() ActvJbNum = Me.EntJobNum strSQL = "SELECT tblRouting.[Job Number], tblRouting.[Start Date], tblRouting.OpDescription, tblRouting.[Op Seq], tblRouting.OpleadTm " & vbCrLf & _ "FROM tblRouting " & vbCrLf & _ "WHERE (tblRouting.[Job Number])= " & ActvJbNum & vbCrLf & _ "ORDER BY tblRouting.[Op Seq] ASC;" Set ourDatabase = CurrentDb ' 显式指定动态游标,确保记录集可编辑 Set ourRecordset = ourDatabase.OpenRecordset(strSQL, dbOpenDynaset) With ourRecordset ' 先判断记录集是否有数据,避免空集报错 If Not .BOF And Not .EOF Then .MoveFirst Do Until .EOF LpRecCnt = LpRecCnt + 1 .Edit ' 第一步:进入编辑模式 ![Start Date] = JS ' 第二步:修改字段值 .Update ' 第三步:保存修改 MsgBox ![Start Date] & vbNewLine & ![Op Seq] & vbNewLine & LpRecCnt .MoveNext Loop End If .Close ' 关闭记录集 End With ' 释放对象,避免内存泄漏 Set ourRecordset = Nothing Set ourDatabase = Nothing
额外优化说明
- 打开Recordset时显式传入
dbOpenDynaset参数,确保记录集处于可编辑状态(默认SELECT语句可能返回静态只读游标)。 - 增加空记录集判断,避免无数据时执行循环引发错误。
- 统一使用变量
ActvJbNum拼接SQL,避免直接引用控件可能带来的异常。 - 循环结束后关闭并释放对象,符合VBA内存管理规范。
内容的提问来源于stack exchange,提问作者sambob_628
相关产品推荐
相关产品推荐

