DataTable合并不同的数据

时间:2014-07-21 17:38:10

标签: c# datatable merge

我试图围绕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设置中仅合并不同的数据字段?

0 个答案:

没有答案