来自合并数据表的GetChanges返回null

时间:2015-05-05 14:32:10

标签: c# winforms datatable merge

我有以下代码:

DataTable datTable3 = new DataTable();
datTable3 = datTable1.Clone();

datTable2.Merge(datTable1);
datTable3 = datTable2.GetChanges();

我想要做的是:将DataTable1与DataTable2进行比较,当DataTable1中有不在DataTable 2中的行时,将这些行添加到新的DataTable(3)中。虽然第一个dt中的行不等于第二个dt中的行,但上面的代码每次都给我一个空的DataTable3。我究竟做错了什么?对不起,如果这个问题可能太容易了,但我几个月后就用C#了。

编辑:我发现这个解决方案对我不起作用......为什么?

 DataTable datTable3 = new DataTable();
        datTable3 = datTable1.Clone();

        foreach (DataRow row in datTable1.Rows)
        {
            datTable3.ImportRow(row);
        }

        foreach (DataRow row in datTable3.Rows)
        {
            row.SetAdded();
        }

        datTable2.Merge(datTable3);
        DataTable datTableFinal = datTable2.GetChanges(DataRowState.Added); 
 // shows me a datatable with again the values from datTable1 
 // even if they are already in datTable2!
        datTable2.RejectChanges();
        datTable1.RejectChanges();

1 个答案:

答案 0 :(得分:1)

DataTable.GetChanges()方法获取DataTable的副本,该副本包含自加载或上次调用AcceptChanges以来对其所做的所有更改。

换句话说,GetChanges()依赖于DataRow.RowState属性。 DataTable.Merge()将保留其“RowState”属性,或将其重置为“Unchanged”。

这意味着当您将两个DataTable与包含'Unchanged'RowStates的行合并时,合并的表也将包含'Unchanged'行,DataTable.GetChanges方法将返回null或Nothing。

编辑:您始终可以遍历DataTable以查看合并表中添加了哪些行。像

这样的东西
foreach(DataRow row in datTable2.Rows)
{
     Console.WriteLine("--- Row ---"); // Print separator.
    foreach (var item in row.ItemArray) // Loop over the items.
    {
    Console.Write("Item: "); // Print label.
    Console.WriteLine(item); // Invokes ToString abstract method.
    }
}