我试图围绕DataTable.Merge,因为它似乎是我想做的事情,它将差异从一个DT合并到另一个DT。
这是两个相同的DataTable,带有主键,然后是合并操作。提供的事件可以窥探他们。
//first table
var dt1 = new DataTable();
dt1.Columns.Add("Col1", typeof(string));
dt1.Columns.Add("Col2", typeof(string));
dt1.PrimaryKey = new[] { dt1.Columns["Col1"] };
//second table.. identical to first
var dt2 = new DataTable();
dt2.Columns.Add("Col1", typeof(string));
dt2.Columns.Add("Col2", typeof(string));
dt2.PrimaryKey = new[] { dt2.Columns["Col1"] };
//some data
object[] o1 = { "1", "A" };
object[] o2 = { "2", DBNull.Value };
object[] o3 = { "3", "C" };
object[] o3New = { "3", "C New" };
//add data to first table
dt1.Rows.Add(o1);
dt1.Rows.Add(o2);
dt1.Rows.Add(o3);
//add data to second table - third row is different
dt2.Rows.Add(o1);
dt2.Rows.Add(o2);
dt2.Rows.Add(o3New);
//register an event on row change
dt1.RowChanged += Row_Changed;
//merge second table into first
dt1.Merge(dt2);
//check for changes to first table
var dt3 = dt1.GetChanges(DataRowState.Modified);
if (dt3 == null)
Console.WriteLine("No changes to dt1");
else {
Console.WriteLine("Modified rows in dt1:" + dt3.Rows.Count);
}
//check for changes to second table for the heck of it
var dt4 = dt2.GetChanges(DataRowState.Modified);
if (dt4 == null)
Console.WriteLine("No changes to dt2");
else {
Console.WriteLine("Modified rows in dt2:" + dt4.Rows.Count);
}
要使用上述内容,此事件可以捕获更改:
private static void Row_Changed(object sender, DataRowChangeEventArgs e) {
Console.WriteLine("Row changed {0}\t{1}\t{2}", e.Action, e.Row.ItemArray[0], e.Row.ItemArray[1]);
}
输出显示所有三行通过事件处理程序进行更改,但最后它表示在调用GetChanges时没有任何改变。如果我按照自己的方式行事,在此设置中只会改变一行。但同时这三个人都在改变着#34; - 但没有一个被改变。
我显然做错了什么。有人比我更聪明解释原因吗?
或者,是否有其他方法可以在相同的架构主键DataTable设置中仅合并不同的数据字段?