DataTable.Merge 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
多載
| 名稱 | Description |
|---|---|
| Merge(DataTable, Boolean, MissingSchemaAction) |
將指定的 DataTable 與目前 |
| Merge(DataTable, Boolean) |
將指定的 DataTable 與當前 |
| Merge(DataTable) |
範例
以下主控台應用程式示範該方法參數missingSchemaAction的行為Merge。 此範例建立兩個相同資料表的版本,並修改第二個版本的結構。 接著程式碼嘗試將第二個資料表合併到第一個資料表。
Note
這個範例展示了如何使用其中一個超載版本的 Merge。 其他可能可用的範例,請參閱個別超載主題。
private static void DemonstrateMergeTable()
{
DataTable table1 = new DataTable("Items");
// Add columns
DataColumn idColumn = new DataColumn("id", typeof(System.Int32));
DataColumn itemColumn = new DataColumn("item", typeof(System.Int32));
table1.Columns.Add(idColumn);
table1.Columns.Add(itemColumn);
// Set the primary key column.
table1.PrimaryKey = new DataColumn[] { idColumn };
// Add RowChanged event handler for the table.
table1.RowChanged += new
System.Data.DataRowChangeEventHandler(Row_Changed);
// Add ten rows.
DataRow row;
for (int i = 0; i <= 9; i++)
{
row = table1.NewRow();
row["id"] = i;
row["item"] = i;
table1.Rows.Add(row);
}
// Accept changes.
table1.AcceptChanges();
PrintValues(table1, "Original values");
// Create a second DataTable identical to the first.
DataTable table2 = table1.Clone();
// Add column to the second column, so that the
// schemas no longer match.
table2.Columns.Add("newColumn", typeof(System.String));
// Add three rows. Note that the id column can't be the
// same as existing rows in the original table.
row = table2.NewRow();
row["id"] = 14;
row["item"] = 774;
row["newColumn"] = "new column 1";
table2.Rows.Add(row);
row = table2.NewRow();
row["id"] = 12;
row["item"] = 555;
row["newColumn"] = "new column 2";
table2.Rows.Add(row);
row = table2.NewRow();
row["id"] = 13;
row["item"] = 665;
row["newColumn"] = "new column 3";
table2.Rows.Add(row);
// Merge table2 into the table1.
Console.WriteLine("Merging");
table1.Merge(table2, false, MissingSchemaAction.Add);
PrintValues(table1, "Merged With table1, schema added");
}
private static void Row_Changed(object sender,
DataRowChangeEventArgs e)
{
Console.WriteLine("Row changed {0}\t{1}", e.Action,
e.Row.ItemArray[0]);
}
private static void PrintValues(DataTable table, string label)
{
// Display the values in the supplied DataTable:
Console.WriteLine(label);
foreach (DataRow row in table.Rows)
{
foreach (DataColumn col in table.Columns)
{
Console.Write("\t " + row[col].ToString());
}
Console.WriteLine();
}
}
Private Sub DemonstrateMergeTable()
Dim table1 As New DataTable("Items")
' Add columns
Dim idColumn As New DataColumn("id", GetType(System.Int32))
Dim itemColumn As New DataColumn("item", GetType(System.Int32))
table1.Columns.Add(idColumn)
table1.Columns.Add(itemColumn)
' Set the primary key column.
table1.PrimaryKey = New DataColumn() {idColumn}
' Add RowChanged event handler for the table.
AddHandler table1.RowChanged, AddressOf Row_Changed
' Add some rows.
Dim row As DataRow
For i As Integer = 0 To 3
row = table1.NewRow()
row("id") = i
row("item") = i
table1.Rows.Add(row)
Next i
' Accept changes.
table1.AcceptChanges()
PrintValues(table1, "Original values")
' Create a second DataTable identical to the first.
Dim table2 As DataTable = table1.Clone()
' Add column to the second column, so that the
' schemas no longer match.
table2.Columns.Add("newColumn", GetType(System.String))
' Add three rows. Note that the id column can't be the
' same as existing rows in the original table.
row = table2.NewRow()
row("id") = 14
row("item") = 774
row("newColumn") = "new column 1"
table2.Rows.Add(row)
row = table2.NewRow()
row("id") = 12
row("item") = 555
row("newColumn") = "new column 2"
table2.Rows.Add(row)
row = table2.NewRow()
row("id") = 13
row("item") = 665
row("newColumn") = "new column 3"
table2.Rows.Add(row)
' Merge table2 into the table1.
Console.WriteLine("Merging")
table1.Merge(table2, False, MissingSchemaAction.Add)
PrintValues(table1, "Merged With table1, Schema added")
End Sub
Private Sub Row_Changed(ByVal sender As Object, _
ByVal e As DataRowChangeEventArgs)
Console.WriteLine("Row changed {0}{1}{2}", _
e.Action, ControlChars.Tab, e.Row.ItemArray(0))
End Sub
Private Sub PrintValues(ByVal table As DataTable, _
ByVal label As String)
' Display the values in the supplied DataTable:
Console.WriteLine(label)
For Each row As DataRow In table.Rows
For Each col As DataColumn In table.Columns
Console.Write(ControlChars.Tab + " " + row(col).ToString())
Next col
Console.WriteLine()
Next row
End Sub
備註
Merge 方法可用來合併兩個具有大致類似架構的 DataTable 物件。 在用戶端應用程式上通常會使用合併,將數據源的最新變更併入現有的 DataTable。 這可讓用戶端應用程式使用數據源的最新數據重新整理 DataTable。
合併操作僅考慮原始資料表及待合併資料表。 子資料表不會受到影響或包含在內。 如果一個資料表有一個或多個子資料表,且這些子資料表定義為關係的一部分,則每個子資料表必須分別合併。
Merge(DataTable, Boolean, MissingSchemaAction)
- 來源:
- DataTable.cs
- 來源:
- DataTable.cs
- 來源:
- DataTable.cs
- 來源:
- DataTable.cs
- 來源:
- DataTable.cs
將指定的 DataTable 與目前 DataTable合併,表示是否保留變更,以及如何處理目前 DataTable中缺少的結構。
public:
void Merge(System::Data::DataTable ^ table, bool preserveChanges, System::Data::MissingSchemaAction missingSchemaAction);
public void Merge(System.Data.DataTable table, bool preserveChanges, System.Data.MissingSchemaAction missingSchemaAction);
member this.Merge : System.Data.DataTable * bool * System.Data.MissingSchemaAction -> unit
Public Sub Merge (table As DataTable, preserveChanges As Boolean, missingSchemaAction As MissingSchemaAction)
參數
- missingSchemaAction
- MissingSchemaAction
這是其中一項 MissingSchemaAction 價值。
範例
以下主控台應用程式示範該方法參數missingSchemaAction的行為Merge。 此範例建立兩個相同資料表的版本,並修改第二個版本的結構。 接著程式碼嘗試將第二個資料表合併到第一個資料表。
private static void DemonstrateMergeTable()
{
DataTable itemsTable = new DataTable("Items");
// Add columns
DataColumn idColumn = new DataColumn("id", typeof(System.Int32));
DataColumn itemColumn = new DataColumn("item", typeof(System.Int32));
itemsTable.Columns.Add(idColumn);
itemsTable.Columns.Add(itemColumn);
// Set the primary key column.
itemsTable.PrimaryKey = new DataColumn[] { idColumn };
// Add RowChanged event handler for the table.
itemsTable.RowChanged +=
new System.Data.DataRowChangeEventHandler(Row_Changed);
// Add ten rows.
DataRow row;
for (int i = 0; i <= 9; i++)
{
row = itemsTable.NewRow();
row["id"] = i;
row["item"] = i;
itemsTable.Rows.Add(row);
}
// Accept changes.
itemsTable.AcceptChanges();
PrintValues(itemsTable, "Original values");
// Create a second DataTable identical to the first.
DataTable itemsClone = itemsTable.Clone();
// Add column to the second column, so that the
// schemas no longer match.
itemsClone.Columns.Add("newColumn", typeof(System.String));
// Add three rows. Note that the id column can't be the
// same as existing rows in the original table.
row = itemsClone.NewRow();
row["id"] = 14;
row["item"] = 774;
row["newColumn"] = "new column 1";
itemsClone.Rows.Add(row);
row = itemsClone.NewRow();
row["id"] = 12;
row["item"] = 555;
row["newColumn"] = "new column 2";
itemsClone.Rows.Add(row);
row = itemsClone.NewRow();
row["id"] = 13;
row["item"] = 665;
row["newColumn"] = "new column 3";
itemsClone.Rows.Add(row);
// Merge itemsClone into the itemsTable.
Console.WriteLine("Merging");
itemsTable.Merge(itemsClone, false, MissingSchemaAction.Add);
PrintValues(itemsTable, "Merged With itemsTable, schema added");
}
private static void Row_Changed(object sender,
DataRowChangeEventArgs e)
{
Console.WriteLine("Row changed {0}\t{1}",
e.Action, e.Row.ItemArray[0]);
}
private static void PrintValues(DataTable table, string label)
{
// Display the values in the supplied DataTable:
Console.WriteLine(label);
foreach (DataRow row in table.Rows)
{
foreach (DataColumn col in table.Columns)
{
Console.Write("\t " + row[col].ToString());
}
Console.WriteLine();
}
}
Private Sub DemonstrateMergeTable()
Dim itemsTable As New DataTable("Items")
' Add columns
Dim idColumn As New DataColumn("id", GetType(System.Int32))
Dim itemColumn As New DataColumn("item", GetType(System.Int32))
itemsTable.Columns.Add(idColumn)
itemsTable.Columns.Add(itemColumn)
' Set the primary key column.
itemsTable.PrimaryKey = New DataColumn() {idColumn}
' Add RowChanged event handler for the table.
AddHandler itemsTable.RowChanged, AddressOf Row_Changed
' Add some rows.
Dim row As DataRow
For i As Integer = 0 To 3
row = itemsTable.NewRow()
row("id") = i
row("item") = i
itemsTable.Rows.Add(row)
Next i
' Accept changes.
itemsTable.AcceptChanges()
PrintValues(itemsTable, "Original values")
' Create a second DataTable identical to the first.
Dim itemsClone As DataTable = itemsTable.Clone()
' Add column to the second column, so that the
' schemas no longer match.
itemsClone.Columns.Add("newColumn", GetType(System.String))
' Add three rows. Note that the id column can't be the
' same as existing rows in the original table.
row = itemsClone.NewRow()
row("id") = 14
row("item") = 774
row("newColumn") = "new column 1"
itemsClone.Rows.Add(row)
row = itemsClone.NewRow()
row("id") = 12
row("item") = 555
row("newColumn") = "new column 2"
itemsClone.Rows.Add(row)
row = itemsClone.NewRow()
row("id") = 13
row("item") = 665
row("newColumn") = "new column 3"
itemsClone.Rows.Add(row)
' Merge itemsClone into the itemsTable.
Console.WriteLine("Merging")
itemsTable.Merge(itemsClone, False, MissingSchemaAction.Add)
PrintValues(itemsTable, "Merged With itemsTable, Schema added")
End Sub
Private Sub Row_Changed(ByVal sender As Object, _
ByVal e As DataRowChangeEventArgs)
Console.WriteLine("Row changed {0}{1}{2}", _
e.Action, ControlChars.Tab, e.Row.ItemArray(0))
End Sub
Private Sub PrintValues(ByVal table As DataTable, ByVal label As String)
' Display the values in the supplied DataTable:
Console.WriteLine(label)
For Each row As DataRow In table.Rows
For Each col As DataColumn In table.Columns
Console.Write(ControlChars.Tab + " " + row(col).ToString())
Next col
Console.WriteLine()
Next row
End Sub
備註
Merge 方法可用來合併兩個具有大致類似架構的 DataTable 物件。 在用戶端應用程式上通常會使用合併,將數據源的最新變更併入現有的 DataTable。 這可讓用戶端應用程式使用數據源的最新數據重新整理 DataTable。
合併操作僅考慮原始資料表及待合併資料表。 子資料表不會受到影響或包含在內。 如果一個資料表有一個或多個子資料表,且這些子資料表定義為關係的一部分,則每個子資料表必須分別合併。
Merge 方法通常會在一系列程序結束時呼叫,包括驗證變更、協調錯誤、使用變更更新數據源,最後重新整理現有的 DataTable。
執行合併時,合併前對現有資料所做的變更會在合併操作中保留,除非開發者指定參數為 false preserveChanges 。 若 preserveChanges 參數設為 true,輸入值不會覆蓋現有列中現有的列值。 如果參數 preserveChanges 設為 false,輸入的值會覆蓋現有列中現有的值。 如需數據列版本的詳細資訊,請參閱 數據列狀態和數據列版本。
在用戶端應用程式中,通常會有一個按鈕讓使用者點擊,收集變更後的資料並驗證,然後再送回中間層元件。 在此案例中,會先叫用 GetChanges 方法。 該方法會傳回第二個 DataTable 針對驗證和合併優化。 第二個 DataTable 物件只包含已變更的 DataTable 和 DataRow 對象,導致原始 DataTable子集。 此子集通常較小,因此能更有效率地回傳給中階元件。 中間層元件接著透過儲存程序更新原始資料來源的變更。 接著,中介層可以傳回新的 DataTable,其中包含原始數據和數據源的最新數據(再次執行原始查詢),也可以傳回子集,其中包含從數據源進行的任何變更。 (例如,如果數據源自動建立唯一的主鍵值,這些值可以傳播回用戶端應用程式。不論是哪一種情況,傳回的 DataTable 都可以與 DataTable 方法合併回用戶端應用程式的原始 Merge。
當呼叫該 Merge 方法時,會比較兩個 DataTable 物件的結構,因為結構可能已被更改。 例如,在企業對企業案例中,自動化程式可能已將新數據行新增至 XML 架構。 如果來源 DataTable 包含目標中遺漏的架構元素(已新增 DataColumn 物件),可以將 missingSchemaAction 自變數設定為 MissingSchemaAction.Add,將架構元素新增至目標。 在此情況下,合併 DataTable 包含新增的架構和數據。
合併架構之後,數據會合併。
將新的來源 DataTable 合併至目標時,任何具有 DataRowState 值 Unchanged、Modified或 Deleted 的來源數據列,會比對具有相同主鍵值的目標數據列。 具有 DataRowState 值 Added 的源數據列會比對與新源數據列具有相同主鍵值的新目標數據列。
另請參閱
適用於
Merge(DataTable, Boolean)
- 來源:
- DataTable.cs
- 來源:
- DataTable.cs
- 來源:
- DataTable.cs
- 來源:
- DataTable.cs
- 來源:
- DataTable.cs
將指定的 DataTable 與當前 DataTable合併,表示是否保留當前 DataTable的變化。
public:
void Merge(System::Data::DataTable ^ table, bool preserveChanges);
public void Merge(System.Data.DataTable table, bool preserveChanges);
member this.Merge : System.Data.DataTable * bool -> unit
Public Sub Merge (table As DataTable, preserveChanges As Boolean)
參數
- table
- DataTable
DataTable將與當前DataTable的 合併。
- preserveChanges
- Boolean
true,以保持電流 DataTable變化;否則 false。
範例
以下主控台應用程式建立包含 DataTable 列的 ,修改這些列中的一些資料,並嘗試合併來自不同 DataTable資料的 。 範例展示了參數的不同 preserveChanges 行為。
private static void DemonstrateMergeTable()
{
// Demonstrate merging, within and without
// preserving changes.
// In this example, take these actions:
// 1. Create a DataTable (table1) and fill the table with data.
// 2. Create a copy of table1, and modify its data (modifiedTable).
// 3. Modify data in table1.
// 4. Make a copy of table1 (table1Copy).
// 5. Merge the data from modifiedTable into table1 and table1Copy,
// showing the difference between setting the preserveChanges
// parameter to true and false.
// Create a new DataTable.
DataTable table1 = new DataTable("Items");
// Add two columns to the table:
DataColumn column = new DataColumn("id", typeof(System.Int32));
column.AutoIncrement = true;
table1.Columns.Add(column);
column = new DataColumn("item", typeof(System.String));
table1.Columns.Add(column);
// Set primary key column.
table1.PrimaryKey = new DataColumn[] { table1.Columns[0] };
// Add some rows.
DataRow row;
for (int i = 0; i <= 3; i++)
{
row = table1.NewRow();
row["item"] = "Item " + i;
table1.Rows.Add(row);
}
// Accept changes.
table1.AcceptChanges();
PrintValues(table1, "Original values");
// Using the same schema as the original table,
// modify the data for later merge.
DataTable modifiedTable = table1.Copy();
foreach (DataRow rowModified in modifiedTable.Rows)
{
rowModified["item"] = rowModified["item"].ToString()
+ " modified";
}
modifiedTable.AcceptChanges();
// Change row values, and add a new row:
table1.Rows[0]["item"] = "new Item 0";
table1.Rows[1]["item"] = "new Item 1";
row = table1.NewRow();
row["id"] = 4;
row["item"] = "Item 4";
table1.Rows.Add(row);
// Get a copy of the modified data:
DataTable table1Copy = table1.Copy();
PrintValues(table1, "Modified and new Values");
PrintValues(modifiedTable, "Data to be merged into table1");
// Merge new data into the modified data.
table1.Merge(modifiedTable, true);
PrintValues(table1, "Merged data (preserve changes)");
table1Copy.Merge(modifiedTable, false);
PrintValues(table1Copy, "Merged data (don't preserve changes)");
}
private static void PrintValues(DataTable table, string label)
{
// Display the values in the supplied DataTable:
Console.WriteLine(label);
foreach (DataRow row in table.Rows)
{
foreach (DataColumn column in table.Columns)
{
Console.Write("\t{0}", row[column, DataRowVersion.Current]);
}
Console.WriteLine();
}
}
Private Sub DemonstrateMergeTable()
' Demonstrate merging, within and without
' preserving changes.
' In this example, take these actions:
' 1. Create a DataTable (table1) and fill the table with data.
' 2. Create a copy of table1, and modify its data (modifiedTable).
' 3. Modify data in table1.
' 4. Make a copy of table1 (table1Copy).
' 5. Merge the data from modifiedTable into table1 and table1Copy,
' showing the difference between setting the preserveChanges
' parameter to true and false.
' Create a new DataTable.
Dim table1 As New DataTable("Items")
' Add two columns to the table:
Dim column As New DataColumn("id", GetType(System.Int32))
column.AutoIncrement = True
table1.Columns.Add(column)
column = New DataColumn("item", GetType(System.String))
table1.Columns.Add(column)
' Set primary key column.
table1.PrimaryKey = New DataColumn() {table1.Columns(0)}
' Add some rows.
Dim row As DataRow
For i As Integer = 0 To 3
row = table1.NewRow()
row("item") = "Item " & i
table1.Rows.Add(row)
Next i
' Accept changes.
table1.AcceptChanges()
PrintValues(table1, "Original values")
' Using the same schema as the original table,
' modify the data for later merge.
Dim modifiedTable As DataTable = table1.Copy()
For Each row In modifiedTable.Rows
row("item") = row("item").ToString() & " modified"
Next
modifiedTable.AcceptChanges()
' Change row values, and add a new row:
table1.Rows(0)("item") = "New Item 0"
table1.Rows(1)("item") = "New Item 1"
row = table1.NewRow()
row("id") = 4
row("item") = "Item 4"
table1.Rows.Add(row)
' Get a copy of the modified data:
Dim table1Copy As DataTable = table1.Copy()
PrintValues(table1, "Modified and New Values")
PrintValues(modifiedTable, "Data to be merged into table1")
' Merge new data into the modified data.
table1.Merge(modifiedTable, True)
PrintValues(table1, "Merged data (preserve changes)")
table1Copy.Merge(modifiedTable, False)
PrintValues(table1Copy, "Merged data (don't preserve changes)")
End Sub
Private Sub PrintValues(ByVal table As DataTable, _
ByVal label As String)
' Display the values in the supplied DataTable:
Console.WriteLine(label)
For Each row As DataRow In table.Rows
For Each column As DataColumn In table.Columns
Console.Write("{0}{1}", ControlChars.Tab, row(column, _
DataRowVersion.Current))
Next column
Console.WriteLine()
Next row
End Sub
備註
合併方法用於合併 DataTable 兩個結構大致相似的物件。 在用戶端應用程式上通常會使用合併,將數據源的最新變更併入現有的 DataTable。 這可讓用戶端應用程式使用數據源的最新數據重新整理 DataTable。
合併操作僅考慮原始資料表及待合併資料表。 子資料表不會受到影響或包含在內。 如果一個資料表有一個或多個子資料表,且這些子資料表定義為關係的一部分,則每個子資料表必須分別合併。
Merge 方法通常會在一系列程序結束時呼叫,包括驗證變更、協調錯誤、使用變更更新數據源,最後重新整理現有的 DataTable。
執行合併時,合併前對現有資料所做的變更會在合併操作中保留,除非開發者指定參數為 false preserveChanges 。 若 preserveChanges 參數設為 true,輸入值不會覆蓋現有列中現有的列值。 如果參數 preserveChanges 設為 false,輸入的值會覆蓋現有列中現有的值。 如需數據列版本的詳細資訊,請參閱 數據列狀態和數據列版本。
在用戶端應用程式中,通常會有一個按鈕讓使用者點擊,收集變更後的資料並驗證,然後再送回中間層元件。 在此案例中,會先叫用 GetChanges 方法。 該方法會傳回第二個 DataTable 針對驗證和合併優化。 第二個 DataTable 物件只包含已變更的 DataTable 和 DataRow 對象,導致原始 DataTable子集。 此子集通常較小,因此能更有效率地回傳給中階元件。 中間層元件接著透過儲存程序更新原始資料來源的變更。 接著,中介層可以傳回新的 DataTable,其中包含原始數據和數據源的最新數據(再次執行原始查詢),也可以傳回子集,其中包含從數據源進行的任何變更。 (例如,如果數據源自動建立唯一的主鍵值,這些值可以傳播回用戶端應用程式。不論是哪一種情況,傳回的 DataTable 都可以與 DataTable 方法合併回用戶端應用程式的原始 Merge。
將新的來源 DataTable 合併至目標時,任何具有 DataRowState 值 Unchanged、Modified或 Deleted 的來源數據列,會比對具有相同主鍵值的目標數據列。 具有 DataRowState 值 Added 的源數據列會比對與新源數據列具有相同主鍵值的新目標數據列。
另請參閱
適用於
Merge(DataTable)
- 來源:
- DataTable.cs
- 來源:
- DataTable.cs
- 來源:
- DataTable.cs
- 來源:
- DataTable.cs
- 來源:
- DataTable.cs
public:
void Merge(System::Data::DataTable ^ table);
public void Merge(System.Data.DataTable table);
member this.Merge : System.Data.DataTable -> unit
Public Sub Merge (table As DataTable)
參數
範例
以下主控台應用程式建立一個簡單的 DataTable 資料,並將資料加入表格。 接著範例會建立一個資料表的複製品,並在副本中加入列數。 最後,範例呼叫 Merge 將第二個資料表的資料與第一個資料表中的資料合併的方法。
private static void DemonstrateMergeTable()
{
DataTable table1 = new DataTable("Items");
// Add columns
DataColumn column1 = new DataColumn("id", typeof(System.Int32));
DataColumn column2 = new DataColumn("item", typeof(System.Int32));
table1.Columns.Add(column1);
table1.Columns.Add(column2);
// Set the primary key column.
table1.PrimaryKey = new DataColumn[] { column1 };
// Add RowChanged event handler for the table.
table1.RowChanged +=
new System.Data.DataRowChangeEventHandler(Row_Changed);
// Add some rows.
DataRow row;
for (int i = 0; i <= 3; i++)
{
row = table1.NewRow();
row["id"] = i;
row["item"] = i;
table1.Rows.Add(row);
}
// Accept changes.
table1.AcceptChanges();
PrintValues(table1, "Original values");
// Create a second DataTable identical to the first.
DataTable table2 = table1.Clone();
// Add three rows. Note that the id column can't be the
// same as existing rows in the original table.
row = table2.NewRow();
row["id"] = 14;
row["item"] = 774;
table2.Rows.Add(row);
row = table2.NewRow();
row["id"] = 12;
row["item"] = 555;
table2.Rows.Add(row);
row = table2.NewRow();
row["id"] = 13;
row["item"] = 665;
table2.Rows.Add(row);
// Merge table2 into the table1.
Console.WriteLine("Merging");
table1.Merge(table2);
PrintValues(table1, "Merged With table1");
}
private static void Row_Changed(object sender,
DataRowChangeEventArgs e)
{
Console.WriteLine("Row changed {0}\t{1}",
e.Action, e.Row.ItemArray[0]);
}
private static void PrintValues(DataTable table, string label)
{
// Display the values in the supplied DataTable:
Console.WriteLine(label);
foreach (DataRow row in table.Rows)
{
foreach (DataColumn col in table.Columns)
{
Console.Write("\t " + row[col].ToString());
}
Console.WriteLine();
}
}
Private Sub DemonstrateMergeTable()
Dim table1 As New DataTable("Items")
' Add columns
Dim column1 As New DataColumn("id", GetType(System.Int32))
Dim column2 As New DataColumn("item", GetType(System.Int32))
table1.Columns.Add(column1)
table1.Columns.Add(column2)
' Set the primary key column.
table1.PrimaryKey = New DataColumn() {column1}
' Add RowChanged event handler for the table.
AddHandler table1.RowChanged, AddressOf Row_Changed
' Add some rows.
Dim row As DataRow
For i As Integer = 0 To 3
row = table1.NewRow()
row("id") = i
row("item") = i
table1.Rows.Add(row)
Next i
' Accept changes.
table1.AcceptChanges()
PrintValues(table1, "Original values")
' Create a second DataTable identical to the first.
Dim table2 As DataTable = table1.Clone()
' Add three rows. Note that the id column can't be the
' same as existing rows in the original table.
row = table2.NewRow()
row("id") = 14
row("item") = 774
table2.Rows.Add(row)
row = table2.NewRow()
row("id") = 12
row("item") = 555
table2.Rows.Add(row)
row = table2.NewRow()
row("id") = 13
row("item") = 665
table2.Rows.Add(row)
' Merge table2 into the table1.
Console.WriteLine("Merging")
table1.Merge(table2)
PrintValues(table1, "Merged With table1")
End Sub
Private Sub Row_Changed(ByVal sender As Object, _
ByVal e As DataRowChangeEventArgs)
Console.WriteLine("Row changed {0}{1}{2}", _
e.Action, ControlChars.Tab, e.Row.ItemArray(0))
End Sub
Private Sub PrintValues(ByVal table As DataTable, _
ByVal label As String)
' Display the values in the supplied DataTable:
Console.WriteLine(label)
For Each row As DataRow In table.Rows
For Each col As DataColumn In table.Columns
Console.Write(ControlChars.Tab + " " + row(col).ToString())
Next col
Console.WriteLine()
Next row
End Sub
備註
合併方法用於合併 DataTable 兩個結構大致相似的物件。 在用戶端應用程式上通常會使用合併,將數據源的最新變更併入現有的 DataTable。 這可讓用戶端應用程式使用數據源的最新數據重新整理 DataTable。
合併操作僅考慮原始資料表及待合併資料表。 子資料表不會受到影響或包含在內。 如果一個資料表有一個或多個子資料表,且這些子資料表定義為關係的一部分,則每個子資料表必須分別合併。
Merge 方法通常會在一系列程序結束時呼叫,包括驗證變更、協調錯誤、使用變更更新數據源,最後重新整理現有的 DataTable。
執行合併時,合併前對現有資料所做的變更會預設保留。 開發者可以透過呼叫此方法的另外兩個超載之一,並指定參數的假值 preserveChanges 來修改此行為。
在用戶端應用程式中,通常會有一個按鈕讓使用者點擊,收集變更後的資料並驗證,然後再送回中間層元件。 在此案例中,會先叫用 GetChanges 方法。 該方法會傳回第二個 DataTable 針對驗證和合併優化。 第二個 DataTable 物件只 DataRow 包含被更改的物件,導致原始物件的 DataTable子集。 此子集通常較小,因此更有效率地回傳給中階元件。 中間層元件接著透過儲存程序更新原始資料來源的變更。 接著,中介層可以傳回新的 DataTable,其中包含原始數據和數據源的最新數據(再次執行原始查詢),也可以傳回子集,其中包含從數據源進行的任何變更。 (例如,如果數據源自動建立唯一的主鍵值,這些值可以傳播回用戶端應用程式。不論是哪一種情況,傳回的 DataTable 都可以與 DataTable 方法合併回用戶端應用程式的原始 Merge。
當將新來源 DataTable 合併到目標時,任何值為 DataRowStateUnchanged、 Modified、 或 Deleted的來源列都會與具有相同主鍵值的目標列進行匹配。 具有 DataRowState 值 Added 的源數據列會比對與新源數據列具有相同主鍵值的新目標數據列。