使用AddNew结合Data控件更新RecordSet时网格数据异常求助
解决方案
你这是踩了Data控件RecordSet操作的两个典型小坑,我帮你梳理下问题和修改方案:
- AddNew后未提交单行修改:你在
.AddNew后给字段赋值,但没有针对当前新增的行调用.Update——循环结束后统一调用的那一次Update根本不会生效,因为此时已经没有处于编辑状态的行,最后所有新增的行都只是在内存里临时存在,没有真正写入RecordSet。 - 多余的Refresh操作:Data控件的
Refresh会重新从原始数据源加载数据,如果你的新增行没被正确提交,Refresh后这些临时行就会被直接清空,这就是为什么你看到行消失了。
修改后的代码应该是这样的:
If Not rs.BOF Then rs.MoveFirst Do Until rs.EOF With Dta_Lines.Recordset .AddNew ' 加上.Value更严谨,避免字段对象引用导致的隐性问题 !Quantity_Ordered = rs.Fields(2).Value !Stock_Code = CStr(rs.Fields(1).Value) .Update ' 每新增一行就提交一次,确保数据写入RecordSet End With rs.MoveNext Loop ' 不需要调用Refresh!新增的行已经在RecordSet里,网格会自动同步显示
另外给你几个额外的注意点,避免后续踩坑:
- 确认
Dta_Lines的RecordSet是可更新的:如果绑定的是数据库表,要保证表有主键,且Data控件的ReadOnly属性设为False;如果是本地RecordSet,要确保创建时设置了可更新的属性。 - 字段类型要兼容:确保
rs里的字段类型和Dta_Lines.Recordset的对应字段匹配,比如rs.Fields(2)要是数值类型,避免赋值时隐性转换失败。 - 可以加事务保证数据一致性:如果新增多行,建议用事务包裹,出错时可以回滚,避免部分数据写入:
Dta_Lines.Recordset.BeginTrans On Error GoTo RollbackHandler If Not rs.BOF Then rs.MoveFirst Do Until rs.EOF With Dta_Lines.Recordset .AddNew !Quantity_Ordered = rs.Fields(2).Value !Stock_Code = CStr(rs.Fields(1).Value) .Update End With rs.MoveNext Loop Dta_Lines.Recordset.CommitTrans Exit Sub RollbackHandler: Dta_Lines.Recordset.RollbackTrans MsgBox "新增数据出错:" & Err.Description, vbCritical
这样修改后,新增的行应该能正确显示在网格里,而且不会因为Refresh丢失数据了。
内容的提问来源于stack exchange,提问作者Harambe
相关产品推荐
相关产品推荐

