Поделиться через


DataTable.Merge Метод

Определение

Объединяет заданный объект DataTable с текущим объектом DataTable.

Перегрузки

Merge(DataTable, Boolean, MissingSchemaAction)

Объедините заданный объект DataTable с текущим объектом DataTable, указав, следует ли сохранить изменения и способ обработки отсутствующей схемы в текущем контейнере данных DataTable.

Merge(DataTable, Boolean)

Объедините заданный объект DataTable с текущим объектом DataTable, указав, следует ли сохранить изменения в контейнере данных 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)

Параметры

table
DataTable

Объект DataTable, объединяемый с текущим объектом DataTable.

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

Объединяет заданный объект DataTable с текущим объектом DataTable.

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)

Параметры

table
DataTable

Объект DataTable, объединяемый с текущим объектом 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 сопоставляются с новыми целевыми строками с теми же значениями первичного ключа, что и новые исходные строки.

См. также раздел

Применяется к