DataTable.Merge Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Перегрузки
Merge(DataTable, Boolean, MissingSchemaAction) |
Объедините заданный объект DataTable с текущим объектом |
Merge(DataTable, Boolean) |
Объедините заданный объект DataTable с текущим объектом |
Merge(DataTable) |
Объединяет заданный объект DataTable с текущим объектом DataTable. |
Примеры
Следующее консольное приложение демонстрирует поведение missingSchemaAction
параметра Merge метода . В этом примере создаются две версии одной таблицы, изменяя схему для второй версии. Затем код пытается объединить вторую таблицу с первой.
Примечание
В этом примере показано, как использовать одну из перегруженных версий 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 с текущим объектом 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)
Параметры
- preserveChanges
- Boolean
Значение true
, если необходимо сохранить изменения в текущем объекте DataTable; в противном случае — значение false
.
- 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 значением , Modified
или Deleted
сопоставляются с целевыми строками с одинаковыми значениями первичного Unchanged
ключа. Исходные строки со значением DataRowStateAdded
сопоставляются с новыми целевыми строками с теми же значениями первичного ключа, что и новые исходные строки.
См. также раздел
Применяется к
Merge(DataTable, Boolean)
- Исходный код:
- 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
Комментарии
Метод Merge используется для слияния двух DataTable объектов, имеющих в значительной степени похожие схемы. Слияние обычно используется в клиентском приложении для включения последних изменений из источника данных в существующий DataTable. Это позволяет клиентскому приложению обновлять DataTable последние данные из источника данных.
Операция слияния учитывает только исходную таблицу и таблицу для объединения. Дочерние таблицы не затрагиваются и не включаются. Если в таблице есть одна или несколько дочерних таблиц, определенных как часть связи, каждая дочерняя таблица должна быть объединена по отдельности.
Метод Merge
обычно вызывается в конце ряда процедур, которые включают проверку изменений, выверку ошибок, обновление источника данных с изменениями и, наконец, обновление существующего DataTable.
При выполнении слияния изменения, внесенные в существующие данные перед слиянием, сохраняются во время операции слияния, если разработчик не указывает значение false для preserveChanges
параметра . preserveChanges
Если параметр имеет значение true
, входящие значения не перезаписывают существующие значения в текущей версии строки существующей строки. preserveChanges
Если параметр имеет значение false
, входящие значения перезаписывают существующие значения в текущей версии строки существующей строки. Дополнительные сведения о версиях строк см. в разделах Состояния строк и Версии строк.
В клиентском приложении обычно есть одна кнопка, которую пользователь может нажать, которая собирает измененные данные и проверяет их перед отправкой обратно в компонент среднего уровня. В этом сценарии GetChanges сначала вызывается метод . Этот метод возвращает вторую DataTable оптимизированную для проверки и слияния. Этот второй DataTable объект содержит только DataTable измененные объекты и DataRow , в результате чего создается подмножество исходного DataTableобъекта . Это подмножество, как правило, меньше, и поэтому это подмножество более эффективно передается обратно в компонент среднего уровня. Затем компонент среднего уровня обновляет исходный источник данных с помощью хранимых процедур. Затем средний уровень может отправить либо новый DataTable , который содержит исходные данные и последние данные из источника данных (повторно выполнив исходный запрос), либо может отправить обратно подмножество с любыми изменениями, которые были внесены в него из источника данных. (Например, если источник данных автоматически создает уникальные значения первичного ключа, эти значения можно распространить обратно в клиентское приложение.) В любом случае возвращенный DataTable объект можно объединить обратно в исходное DataTable клиентское Merge приложение с помощью метода .
При слиянии нового источника DataTable с целевым объектом все исходные строки со DataRowState значением , Modified
или Deleted
сопоставляются с целевыми строками с одинаковыми значениями первичного Unchanged
ключа. Исходные строки со значением DataRowStateAdded
сопоставляются с новыми целевыми строками с теми же значениями первичного ключа, что и новые исходные строки.
См. также раздел
Применяется к
Merge(DataTable)
- Исходный код:
- 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
Комментарии
Метод Merge используется для слияния двух DataTable объектов, имеющих в значительной степени похожие схемы. Слияние обычно используется в клиентском приложении для включения последних изменений из источника данных в существующий DataTable. Это позволяет клиентскому приложению обновлять DataTable последние данные из источника данных.
Операция слияния учитывает только исходную таблицу и таблицу для объединения. Дочерние таблицы не затрагиваются и не включаются. Если в таблице есть одна или несколько дочерних таблиц, определенных как часть связи, каждая дочерняя таблица должна быть объединена по отдельности.
Метод Merge
обычно вызывается в конце ряда процедур, которые включают проверку изменений, выверку ошибок, обновление источника данных с изменениями и, наконец, обновление существующего DataTable.
При выполнении слияния изменения, внесенные в существующие данные перед слиянием, сохраняются по умолчанию во время операции слияния. Разработчики могут изменить это поведение, вызвав одну из двух других перегрузок для этого метода и указав ложное preserveChanges
значение для параметра .
В клиентском приложении обычно есть одна кнопка, которую пользователь может нажать, которая собирает измененные данные и проверяет их перед отправкой обратно в компонент среднего уровня. В этом сценарии GetChanges сначала вызывается метод . Этот метод возвращает вторую DataTable оптимизированную для проверки и слияния. Этот второй DataTable объект содержит только DataRow измененные объекты, в результате чего создается подмножество исходного DataTableобъекта . Как правило, это подмножество меньше и, следовательно, более эффективно передается компоненту среднего уровня. Затем компонент среднего уровня обновляет исходный источник данных с помощью хранимых процедур. Затем средний уровень может отправить либо новый DataTable , который содержит исходные данные и последние данные из источника данных (повторно выполнив исходный запрос), либо может отправить обратно подмножество с любыми изменениями, которые были внесены в него из источника данных. (Например, если источник данных автоматически создает уникальные значения первичного ключа, эти значения можно распространить обратно в клиентское приложение.) В любом случае возвращенный DataTable объект можно объединить обратно в исходное DataTable клиентское Merge приложение с помощью метода .
При слиянии нового источника DataTable с целевым объектом все исходные строки со значением DataRowState , Modified
или Deleted
сопоставляются с целевыми строками с теми же значениями первичного Unchanged
ключа. Исходные строки со значением DataRowStateAdded
сопоставляются с новыми целевыми строками с теми же значениями первичного ключа, что и новые исходные строки.