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
相关产品推荐
相关产品推荐

