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

C# 传递DataTable到方法后所有行状态变为Modified如何解决?

问题根本原因

  • ADO.NET中DataRow的内置逻辑:只要对处于DataRowState.Unchanged状态的行执行列赋值操作,无论新值与旧值是否相等,RowState都会自动切换为Modified,该行为和传参方式无关
  • 你代码中加的ref关键字属于冗余:DataTable是引用类型,即使不加ref,方法内操作的也是原始实例,不会生成副本
  • 如果出现所有行RowState都变为Modified的情况,大概率是你没有提前比对当前列值和目标值是否一致,对已为目标值的行做了无意义赋值触发了状态变更

修复方案

修改ReaplicConfigDoc方法逻辑,先做值比对再赋值,若你修改后需要让行保持Unchanged状态,赋值后调用对应行的AcceptChanges()即可:

public static void ReaplicConfigDoc(DataTable tabel)
{
     foreach (DataRow rand in tabel.Rows)
     {
         if (rand.RowState != DataRowState.Unchanged) 
             continue;
         
         // 先比对当前值和目标值是否一致,避免无意义赋值
         var currentValue = rand["Column"];
         if (currentValue == DBNull.Value || !currentValue.Equals(56))
         {
             rand["Column"] = 56;
             // 若需要修改后行状态仍保持Unchanged,打开下面一行注释
             // rand.AcceptChanges();
         }
     }
}

调用时也不需要传ref:

SameNameSpace.Form1.ReaplicConfigDoc(SameNameSpace.Form1.DataTableOriginal);

内容的提问来源于stack exchange,提问作者Razvan Ionescu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:27:03