在DataSet.Merge和RowState上混淆

时间:2015-05-05 18:50:22

标签: c# .net dataset

考虑以下过度简化的DataTable对象:

enter image description here

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();
}

该代码产生以下结果:

enter image description here

查看最终的RowState值。它被修改了。怎么会?复制的数据集实例没有任何更改,我明确地将preserveChanges参数设置为false。因此,现在不应该将行视为Unchanged

This MSDN article表示当合并行时,它们的状态也会跟随。这篇文章是错的,还是我的代码中有些东西?

2 个答案:

答案 0 :(得分:1)

所以我在文档中深入挖掘并发现了这个:

  

如果传入的行具有未更改的RowState和现有行   RowState的RowState是RowState的ModifiedState,Deleted或Added   现有行设置为Modified。

因此,将未更改的行合并到已修改的行时,这似乎是预期的行为。

可以找到完整的文章here

答案 1 :(得分:0)

我遇到了同样的问题,最后通过从主DataTable对象中拉出所有更改,在核心对象上运行AcceptChanges,然后对各个表进行处理并将它们合并回main。这样,核心DataTable对象中的所有内容都是“未修改”,并且只会吸收合并数据的RowState,而不会发生任何意外调整。