public void Merge_ByDataSet()
{
//create source dataset
var ds = new DataSet();
DataTable dt = DataProvider.CreateParentDataTable();
dt.TableName = "Table1";
ds.Tables.Add(dt.Copy());
dt.TableName = "Table2";
//add primary key
dt.PrimaryKey = new DataColumn[] { dt.Columns[0] };
ds.Tables.Add(dt.Copy());
//create target dataset (copy of source dataset)
DataSet dsTarget = ds.Copy();
int iTable1RowsCount = dsTarget.Tables["Table1"].Rows.Count;
//Source - add another table, don't exists on the target dataset
ds.Tables.Add(new DataTable("SomeTable"));
ds.Tables["SomeTable"].Columns.Add("Id");
ds.Tables["SomeTable"].Rows.Add(new object[] { 777 });
//Target - add another table, don't exists on the source dataset
dsTarget.Tables.Add(new DataTable("SmallTable"));
dsTarget.Tables["SmallTable"].Columns.Add("Id");
dsTarget.Tables["SmallTable"].Rows.Add(new object[] { 777 });
//update existing row
ds.Tables["Table2"].Select("ParentId=1")[0][1] = "OldValue1";
//add new row
object[] arrAddedRow = new object[] { 99, "NewValue1", "NewValue2", new DateTime(0), 0.5, true };
ds.Tables["Table2"].Rows.Add(arrAddedRow);
//delete existing rows
foreach (DataRow dr in ds.Tables["Table2"].Select("ParentId=2"))
{
dr.Delete();
}
// Merge - changed values
dsTarget.Merge(ds);
Assert.Equal("OldValue1", dsTarget.Tables["Table2"].Select("ParentId=1")[0][1]);
// Merge - added values
Assert.Equal(arrAddedRow, dsTarget.Tables["Table2"].Select("ParentId=99")[0].ItemArray);
// Merge - deleted row
Assert.Equal(0, dsTarget.Tables["Table2"].Select("ParentId=2").Length);
//Table1 rows count should be double (no primary key)
// Merge - Unchanged table 1
Assert.Equal(iTable1RowsCount * 2, dsTarget.Tables["Table1"].Rows.Count);
//SmallTable rows count should be the same
// Merge - Unchanged table 2
Assert.Equal(1, dsTarget.Tables["SmallTable"].Rows.Count);
//SomeTable - new table
// Merge - new table
Assert.Equal(true, dsTarget.Tables["SomeTable"] != null);
}