我有以下代码:
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();
当我尝试此方法时,更改具有所需的值。