Прочитать на английском

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


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();
    }
}

Комментарии

Метод 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);

Параметры

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();
    }
}

Комментарии

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

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

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

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Merge(DataTable, Boolean)

Исходный код:
DataTable.cs
Исходный код:
DataTable.cs
Исходный код:
DataTable.cs

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

public void Merge (System.Data.DataTable table, bool preserveChanges);

Параметры

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();
    }
}

Комментарии

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

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

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

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Merge(DataTable)

Исходный код:
DataTable.cs
Исходный код:
DataTable.cs
Исходный код:
DataTable.cs

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

public void Merge (System.Data.DataTable table);

Параметры

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();
    }
}

Комментарии

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

Операция слияния учитывает только исходную таблицу и таблицу для объединения. Дочерние таблицы не затрагиваются и не включаются. Если в таблице есть одна или несколько дочерних таблиц, определенных как часть связи, каждая дочерняя таблица должна быть объединена по отдельности.

Метод Merge обычно вызывается в конце ряда процедур, которые включают проверку изменений, выверку ошибок, обновление источника данных с изменениями и, наконец, обновление существующего DataTable.

При выполнении слияния изменения, внесенные в существующие данные перед слиянием, сохраняются по умолчанию во время операции слияния. Разработчики могут изменить это поведение, вызвав одну из двух других перегрузок для этого метода и указав ложное preserveChanges значение для параметра .

В клиентском приложении обычно есть одна кнопка, которую пользователь может нажать, которая собирает измененные данные и проверяет их перед отправкой обратно в компонент среднего уровня. В этом сценарии GetChanges сначала вызывается метод . Этот метод возвращает вторую DataTable оптимизированную для проверки и слияния. Этот второй DataTable объект содержит только DataRow измененные объекты, в результате чего создается подмножество исходного DataTableобъекта . Как правило, это подмножество меньше и, следовательно, более эффективно передается компоненту среднего уровня. Затем компонент среднего уровня обновляет исходный источник данных с помощью хранимых процедур. Затем средний уровень может отправить либо новый DataTable , который содержит исходные данные и последние данные из источника данных (повторно выполнив исходный запрос), либо может отправить обратно подмножество с любыми изменениями, которые были внесены в него из источника данных. (Например, если источник данных автоматически создает уникальные значения первичного ключа, эти значения можно распространить обратно в клиентское приложение.) В любом случае возвращенный DataTable объект можно объединить обратно в исходное DataTable клиентское Merge приложение с помощью метода .

При слиянии нового источника DataTable с целевым объектом все исходные строки со значением DataRowState , Modifiedили Deletedсопоставляются с целевыми строками с теми же значениями первичного Unchangedключа. Исходные строки со значением DataRowStateAdded сопоставляются с новыми целевыми строками с теми же значениями первичного ключа, что и новые исходные строки.

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

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

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1