来自合并数据表的获取更改返回 null



我有以下代码:

DataTable datTable3 = new DataTable();
datTable3 = datTable1.Clone();
datTable2.Merge(datTable1);
datTable3 = datTable2.GetChanges();

我想做的是:将 DataTable1 与 DataTable2 进行比较,当 DataTable1 中有行不在 DataTable 2 中时,将这些行添加到新的 DataTable(3) 中。上面的这段代码每次都会给我一个空的 DataTable3,尽管第一个 dt 中的行不等于第二个 dt 中的行。我做错了什么?抱歉,如果这个问题可能太容易了,但我从几个月开始使用 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();

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

换句话说,GetChanges()依赖于 DataRow.RowState 属性。DataTable.Merge() 将保留其"RowState"属性,或将其重置为"未更改"。

这意味着,当您将两个 DataTable 与具有"未更改"的行状态合并时,合并的表还将包含"未更改"行,并且 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.
}
}

遍历并使用LoadDataRow(object[] value, bool fAcceptChanges)

foreach (DataRow row in MergeTable.Rows)
{
TargetTable.LoadDataRow(row.ItemArray, false);
}
var changes = TargetTable.GetChanges();

当我尝试此方法时,更改具有所需的值。

最新更新