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

DataTable已删除行异常显示求助:计数含已删行、遍历触发报错

DataTable已删除行未清除、遍历报错的原因分析

核心原因

DataTable的Delete()方法本质是标记行状态为删除,而非立即物理移除行。标记为Deleted的行仍会保留在Rows集合中,因此Row.Count会将其计入总数。当直接遍历Rows集合时,尝试访问已删除行的内容就会触发「Cannot access deleted rows」错误——因为已删除状态的行不允许被正常读取。只有调用AcceptChanges()后,DataTable才会彻底清除这些标记为删除的行。

是否因设置改动导致?

不存在直接控制该行为的DataTable全局设置,但以下改动可能引发该异常:

  • 误删/注释了AcceptChanges()调用:如果之前的代码在删除行后会隐式或显式调用AcceptChanges()(比如通过DataAdapter执行数据库更新后自动触发,或者代码中主动调用),现在这一步缺失就会导致已删除行残留。
  • 遍历方式从DataView改为直接遍历DataTable:如果原本是通过设置了RowStateFilter = DataViewRowState.CurrentRows的DataView来遍历(自动过滤已删除行),后来改成直接遍历DataTable.Rows,就会访问到已删除行触发错误。
  • 删除方法从Remove()改为Delete():DataRowCollection.Remove()是直接物理移除行,不会留下删除标记;如果原本用的是Remove(),后来改成Delete(),就会出现行残留的情况。

解决建议

  • 若无需保留删除状态同步到数据库,直接用DataTable.Rows.Remove(DataRow)或Rows.RemoveAt(int index)删除行,无需调用AcceptChanges()即可立即移除行。
  • 若必须使用Delete()(比如需要和数据库同步修改状态),遍历前过滤行状态:
    foreach (DataRow rwUpdatedRefs in tblUpdatedRefs.Rows.Cast<DataRow>().Where(r => r.RowState != DataRowState.Deleted))
    {
        // 处理逻辑
    }
    
  • 确认业务场景是否需要保留删除状态,若不需要,在删除行后主动调用tblUpdatedRefs.AcceptChanges()清除已标记的行。

内容的提问来源于stack exchange,提问作者David Williamson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:46:07