Merge
方法用于合并架构大致相似的两个
DataSet
对象。合并在客户端应用程序上通常用于将数据源中最近的更改合并到现有的
DataSet
中。这使客户端应用程序能够拥有用数据源中的最新数据刷新的
DataSet
。通常在一系列过程的末尾调用
Merge
方法,这些过程涉及验证更改、消除错误、使用更改更新数据源并最后刷新现有的
DataSet
。
在客户端应用程序中,通常有这样一个按钮,用户可以单击它来收集已更改的数据并对其进行验证,然后将其发送回中间层组件。在这种情况下,将首先调用
GetChanges
方法。该方法返回另一个为验证和合并而优化的
DataSet
。第二个
DataSet
对象只包含已更改的
DataTable
和
DataRow
对象,结果产生初始
DataSet
的子集。该子集通常较小,因此可以更有效率地传递回中间层组件。然后,中间层组件将通过存储过程使用更改更新初始数据源。然后,中间层可以发送回一个新的
DataSet
,其中包含数据源中的初始数据和最新数据(通过再次运行初始查询);或者它可以发送回包含从数据源对其进行的所有更改的子集。(例如,如果数据源自动创建唯一主键值,则可以将这些值传播回客户端应用程序。)在哪一种情况下都可以使用
Merge
方法将返回的
DataSet
合并回客户端应用程序的初始
DataSet
。
当将新的源
DataSet
合并到目标中时,
DataRowState
值为
Unchanged
、
Modified
或
Deleted
的任何源行都会与具有同一主键值的目标行相匹配。
DataRowState
值为
Added
的源行将匹配主键值与新源行相同的新目标行。
|
列名
|
数据类型
|
说明
|
Code
|
nchar
|
产品代码
(
主键列
)
|
Name
|
nvarchar
|
产名名称
|
UnitPrice
|
numeric
|
产品单价
|
列名
|
数据类型
|
说明
|
Code
|
string
|
产品代码
(
主键列
)
|
Name
|
string
|
产名名称
|
UnitPrice
|
decimal
|
产品单价
|
Code
|
Name
|
UnitPrice
|
1001
|
金砂朱古力
|
120.00
|
Code
|
Name
|
UnitPrice
|
1001
|
金砂朱古力
|
120.00
|
1002
|
金砂朱古力
|
130.00
|
列名
|
数据类型
|
说明
|
ID
|
Int
|
自动增长列 (主键)
|
Code
|
String
|
产品代码 (
key 键)
|
Name
|
String
|
产名名称
|
UnitPrice
|
decimal
|
产品单价
|
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace test1
... {
class Program
...{
static void Main(string[] args)
...{
test ts = new test();
ts.DemonstrateMergeTableAddSchema();
}
}
class test
...{
public void DemonstrateMergeTableAddSchema()
...{
// Create a DataSet with one table, two columns, and ten rows.
DataSet dataSet = new DataSet("dataSet");
DataTable table = new DataTable("Items");
// Add table to the DataSet
dataSet.Tables.Add(table);
// Create and add two columns to the DataTable
DataColumn idColumn = new DataColumn("id",
Type.GetType("System.Int32"), "");
idColumn.AutoIncrement = true;
DataColumn itemColumn = new DataColumn("Item",
Type.GetType("System.Int32"), "");
table.Columns.Add(idColumn);
table.Columns.Add(itemColumn);
// Set the primary key to the first column.
table.PrimaryKey = new DataColumn[1] ...{ idColumn };
// Add RowChanged event handler for the table.
// table.RowChanged += new DataRowChangeEventHandler(Row_Changed);
// Add ten rows.
for (int i = 0; i < 10; i++)
...{
DataRow row = table.NewRow();
row["Item"] = i;
table.Rows.Add(row);
}
// Accept changes.
dataSet.AcceptChanges();
DataRow dr = table.NewRow();
dr[1] = "5555";
table.Rows.Add(dr);
table.Rows[9][1] = "99";
// table.Rows[4].Delete();
// table.Rows[10].Delete();
PrintValues(dataSet, "Original values");
Console.WriteLine("-------- ");
// Create a second DataTable identical to the first, with
// one extra column using the Clone method.
DataTable cloneTable = table.Clone();
cloneTable.Columns.Add("extra", typeof(string));
// Add two rows. Note that the id column can'table be the
// same as existing rows in the DataSet table.
DataRow newRow;
newRow = cloneTable.NewRow();
newRow["id"] = 4;
newRow["Item"] = 555;
newRow["extra"] = "extra Column 1";
cloneTable.Rows.Add(newRow);
newRow = cloneTable.NewRow();
newRow["id"] = 10;
newRow["Item"] = 665;
newRow["extra"] = "extra Column 2";
cloneTable.Rows.Add(newRow);
newRow = cloneTable.NewRow();
newRow["id"] = 9;
newRow["Item"] = 959;
newRow["extra"] = "extra Column 4";
cloneTable.Rows.Add(newRow);
newRow = cloneTable.NewRow();
newRow["id"] = 14;
newRow["Item"] = 777;
newRow["extra"] = "extra Column 3";
cloneTable.Rows.Add(newRow);
//cloneTable.Rows[0][1] = "4";
//cloneTable.Rows[1][1] = "88781";
//cloneTable.Rows[2][1] = "88782";
//cloneTable.Rows[3][1] = "88783";
// cloneTable.AcceptChanges();
// cloneTable.Rows[0].Delete();
// cloneTable.Rows[1].Delete();
//cloneTable.Rows[2].Delete();
// cloneTable.Rows[0].Delete();
Console.WriteLine("TableName: " + cloneTable.TableName);
foreach (DataRow row in cloneTable.Rows)
...{
foreach (DataColumn column in cloneTable.Columns)
...{
Console.Write(" able " + row[column]);
}
Console.Write(" ---- " + row.RowState);
Console.WriteLine();
}
// Merge the table into the DataSet.
Console.WriteLine("Merging");
dataSet.Merge(cloneTable,true, MissingSchemaAction.Add);
//table.AcceptChanges();
PrintValues(dataSet, "Merged With Table, Schema Added");
}
private void Row_Changed(object sender,
DataRowChangeEventArgs e)
...{
Console.WriteLine("Row Changed " + e.Action.ToString()
+ " able" + e.Row.ItemArray[0]);
}
private void PrintValues(DataSet dataSet, string label)
...{
Console.WriteLine(" " + label);
foreach (DataTable table in dataSet.Tables)
...{
Console.WriteLine("TableName: " + table.TableName);
foreach (DataRow row in table.Rows)
...{
foreach (DataColumn column in table.Columns)
...{
Console.Write(" able " + row[column]);
}
Console.Write(" ---- " + row.RowState);
Console.WriteLine();
}
}
}
}
}
dataSet.Merge(cloneTable,false, MissingSchemaAction.Add);
数据为cloneTable的数据.
当Table字段为 Unchanged.
cloneTable 为 Unchanged Merge 后 Unchanged
当Table字段为 Modified ,Added,Deleted
cloneTable 为 Unchanged Merge 后 Modified
----------------------------------------------------------
当Table字段为 Modified,Unchanged,Deleted
cloneTable 为 Added Merge 后 Modified
当Table字段为 Added
cloneTable 为 Added Merge 后 Added
---------------------------------------------------------
当Table字段为 Modified,Unchanged,Deleted,Added
cloneTable 为 Deleted Merge 后 Deleted
cloneTable 为 Modified Merge 后 Modified
dataSet.Merge(cloneTable,true, MissingSchemaAction.Add);
数据为Table的数据.
当Table字段为 Modified ,Added,Unchanged
cloneTable 为 Unchanged Merge 后 Modified
当Table字段为 Deleted
cloneTable 为 Unchanged Merge 后 Deleted
----------------------------------------------------------
当Table字段为 Modified,Unchanged,
cloneTable 为 Added Merge 后 Modified
当Table字段为 Added
cloneTable 为 Added Merge 后 Added
当Table字段为 Deleted
cloneTable 为 Added Merge 后 Deleted
---------------------------------------------------------
当Table字段为 Modified,Unchanged,Added
cloneTable 为 Deleted Merge 后 Modified
cloneTable 为 Modified Merge 后 Modified
当Table字段为 Deleted
cloneTable 为 Modified,Deleted Merge 后 Deleted
-----------------------------------------------------------