Как добавить один DataTable в другой DataTable - PullRequest
40 голосов
/ 13 мая 2009

Я хотел бы добавить один DataTable к другому DataTable. Я вижу, что класс DataTable имеет два метода; «Загрузить (IDataReader)» и «Объединить (DataTable)». Из документации оба, как представляется, «объединяют» входящие данные с существующей таблицей данных, если строки существуют. Я буду делать слияние в слое доступа к данным.

Я мог бы использовать IDataReader и использовать метод Load для объединения DataTables. Или я мог бы загрузить DataSet с помощью IDataReader, получить DataTable из DataSet, а затем использовать метод Merge для объединения DataTables.

Мне было интересно, может ли кто-нибудь сказать мне, какой метод следует использовать?

В качестве альтернативы, дайте мне знать, если у вас есть другое предложение о том, как выполнить эту задачу.

Ответы [ 6 ]

52 голосов
/ 18 мая 2013

Тип данных в том же имени столбцов должен быть равен.

dataTable1.Merge(dataTable2);

После этого результат:

dataTable1 = dataTable1 + dataTable2

47 голосов
/ 13 мая 2009

Для слияния требуется DataTable, для загрузки требуется IDataReader - поэтому в зависимости от того, к чему ваш уровень данных предоставляет доступ, используйте требуемый метод. Насколько я понимаю, Load внутренне вызовет Merge, но не уверен на 100% в этом.

Если у вас есть две таблицы данных, используйте Merge.

17 голосов
/ 14 мая 2009

Вы можете позволить вашему DataAdapter сделать работу. DataAdapter.Fill(DataTable) добавит ваши новые строки к любым существующим строкам в DataTable.

5 голосов
/ 22 сентября 2015

Добавьте два набора данных, содержащих таблицы данных, теперь он будет объединяться по мере необходимости

DataSet ds1 = new DataSet();
DataSet ds2 = new DataSet();

DataTable dt1 = new DataTable();
dt1.Columns.Add(new DataColumn("Column1", typeof(System.String)));

DataRow newSelRow1 = dt1.NewRow();
newSelRow1["Column1"] = "Select";
dt1.Rows.Add(newSelRow1);

DataTable dt2 = new DataTable();
dt2.Columns.Add(new DataColumn("Column1", typeof(System.String)));

DataRow newSelRow2 = dt1.NewRow();
newSelRow2["Column1"] = "DataRow1Data";  // Data
dt2.Rows.Add(newSelRow2);

ds1.Tables.Add(dt1);
ds2.Tables.Add(dt2);

ds1.Tables[0].Merge(ds2.Tables[0]);

Теперь ds1 будет иметь объединенные данные

1 голос
/ 09 января 2019

Рассмотрим решение, которое будет аккуратно обрабатывать произвольное количество таблиц.

//ASSUMPTION: All tables must have the same columns
var tables = new List<DataTable>();
tables.Add(oneTableToRuleThemAll);
tables.Add(oneTableToFindThem);
tables.Add(oneTableToBringThemAll);
tables.Add(andInTheDarknessBindThem);
//Or in the real world, you might be getting a collection of tables from some abstracted data source.

//behold, a table too great and terrible to imagine
var theOneTable = tables.SelectMany(dt => dt.AsEnumerable()).CopyToDataTable();

Инкапсулировано в помощник для дальнейшего использования:

public static DataTable CombineDataTables(params DataTable[] args)
{
    return args.SelectMany(dt => dt.AsEnumerable()).CopyToDataTable();
}

Просто есть несколько таблиц, объявленных в коде?

var combined = CombineDataTables(dt1,dt2,dt3);

Хотите объединить в одну из существующих таблиц вместо создания новой?

dt1 = CombineDataTables(dt1,dt2,dt3);

Уже есть коллекция таблиц, вместо объявленных одна за другой?

//Pretend variable tables already exists
var tables = new[] { dt1, dt2, dt3 };
var combined = CombineDataTables(tables);
0 голосов
/ 20 октября 2018

использовать цикл

  for (int i = 0; i < dt1.Rows.Count; i++)
        {      
           dt2.Rows.Add(dt1.Rows[i][0], dt1.Rows[i][1], ...);//you have to insert all Columns...
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...