You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AddNew结合Data控件更新RecordSet时网格数据异常求助

解决方案

你这是踩了Data控件RecordSet操作的两个典型小坑,我帮你梳理下问题和修改方案:

  1. AddNew后未提交单行修改:你在.AddNew后给字段赋值,但没有针对当前新增的行调用.Update——循环结束后统一调用的那一次Update根本不会生效,因为此时已经没有处于编辑状态的行,最后所有新增的行都只是在内存里临时存在,没有真正写入RecordSet。
  2. 多余的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:27:58