考虑以下过度简化的DataTable
对象:
Id
是一个自动递增的整数,它作用于表的主键,而Text
是一个简单的String
类型的列。
现在考虑以下代码:
private static void Main(string[] args)
{
var dataSet = new TestingDataSet();
var row = dataSet.TestingTable.AddTestingTableRow("First");
dataSet.AcceptChanges();
var copiedDataSet = dataSet.Copy();
Console.WriteLine("Row after initialization:");
Console.WriteLine();
Console.WriteLine("Text : " + row.Text);
Console.WriteLine("State: " + row.RowState.ToString());
Console.WriteLine();
row.Text = "Modifications";
Console.WriteLine("Row after changes:");
Console.WriteLine();
Console.WriteLine("Text : " + row.Text);
Console.WriteLine("State: " + row.RowState.ToString());
Console.WriteLine();
dataSet.Merge(copiedDataSet, false);
Console.WriteLine("Row after merge:");
Console.WriteLine();
Console.WriteLine("Text : " + row.Text);
Console.WriteLine("State: " + row.RowState.ToString());
Console.WriteLine();
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
该代码产生以下结果:
查看最终的RowState
值。它被修改了。怎么会?复制的数据集实例没有任何更改,我明确地将preserveChanges
参数设置为false
。因此,现在不应该将行视为Unchanged
?
This MSDN article表示当合并行时,它们的状态也会跟随。这篇文章是错的,还是我的代码中有些东西?
答案 0 :(得分:1)
所以我在文档中深入挖掘并发现了这个:
如果传入的行具有未更改的RowState和现有行 RowState的RowState是RowState的ModifiedState,Deleted或Added 现有行设置为Modified。
因此,将未更改的行合并到已修改的行时,这似乎是预期的行为。
可以找到完整的文章here。
答案 1 :(得分:0)
我遇到了同样的问题,最后通过从主DataTable对象中拉出所有更改,在核心对象上运行AcceptChanges,然后对各个表进行处理并将它们合并回main。这样,核心DataTable对象中的所有内容都是“未修改”,并且只会吸收合并数据的RowState,而不会发生任何意外调整。