Как добавить один DataTable в другой DataTable
Я хотел бы добавить один DataTable в другой DataTable. Я вижу, что класс DataTable имеет два метода; "Загрузить (IDataReader)" и "Merge (DataTable)". Из документации обе кажутся "объединить" входящие данные с существующим DataTable, если существуют строки. Я буду выполнять слияние на уровне доступа к данным.
Я мог бы использовать IDataReader и использовать метод Load для объединения DataTables. Или я могу загрузить DataSet с помощью IDataReader, получить DataTable из DataSet, а затем использовать метод Merge для объединения DataTables.
Мне было интересно, может ли кто-нибудь сказать мне, какой именно метод использовать?
В качестве альтернативы, дайте мне знать, если у вас есть другое предложение о том, как выполнить эту задачу.
Ответы
Ответ 1
Слияние принимает DataTable, для загрузки требуется IDataReader - поэтому в зависимости от того, какой доступ к вашему слою данных вам нужен, используйте требуемый метод. Я понимаю, что Load будет внутренне вызывать Merge, но не 100% уверен в этом.
Если у вас есть две таблицы данных, используйте Merge.
Ответ 2
Тип данных в том же имени столбца должен быть равен.
dataTable1.Merge(dataTable2);
После этого результат:
dataTable1 = dataTable1 + dataTable2
Ответ 3
Вы можете позволить своей DataAdapter
выполнить эту работу. DataAdapter.Fill(DataTable)
добавит ваши новые строки в любые существующие строки в DataTable
.
Ответ 4
Добавьте два набора данных, содержащих данные, теперь он будет сжиматься по мере необходимости
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
использовать цикл
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...
}
Ответ 6
Рассмотрим решение, которое будет аккуратно обрабатывать произвольное количество таблиц.
//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);