it-roy-ru.com

Как добавить один DataTable в другой DataTable

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

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

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

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

38
Jason Kanaris

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

Если у вас есть две DataTables, используйте Merge.

46
Thies

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

dataTable1.Merge(dataTable2);

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

dataTable1 = dataTable1 + dataTable2

48
Xtian11

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

17
Sam Axe

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

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 будет иметь объединенные данные

5
Ramesh Venkataswamy

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

//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
Derpy