Скопировать DataTable из одного DataSet в другой
Я пытаюсь добавить в новый DataSet X DataTable, который находится внутри другого DataSet Y.
Если я добавлю его напрямую, я получаю следующую ошибку:
DataTable уже принадлежит другому DataSet.
Нужно ли клонировать DataTable и импортировать все строки в него, а затем добавить новый DataTable в новый DataSet? Есть ли лучший/простой способ сделать это?
Ответы
Ответ 1
Есть два простых способа сделать это:
DataTable.Copy
Вместо DataTable.Clone
используйте DataTable.Copy
, чтобы создать копия вашей таблицы данных; затем вставьте копию в цель DataSet
:
dataSetX.Tables.Add( dataTableFromDataSetY.Copy() );
DataSet.Merge
Вы также можете использовать DataSet.Merge
:
dataSetX.Merge(dataTableFromDataSetY);
Обратите внимание, что если вы собираетесь использовать этот метод, вы можете убедиться, что ваша целевая DataSet
еще не содержит таблицу с тем же именем:
-
Если целевой DataSet не содержит таблицу с тем же именем, внутри набора данных создается новая копия таблицы;
-
Если таблица с таким же именем уже находится в целевом наборе данных, тогда она будет слита с той, которая была передана в Merge
, и вы получите комбинацию из двух.
Ответ 2
Используйте эту общую функцию
public DataTable CopyDataTable(DataTable dtSource, int iRowsNeeded)
{
if (dtSource.Rows.Count > iRowsNeeded)
{
// cloned to get the structure of source
DataTable dtDestination = dtSource.Clone();
for (int i = 0; i < iRowsNeeded; i++)
{
dtDestination.ImportRow(dtSource.Rows[i]);
}
return dtDestination;
}
else
return dtSource;
}
Предположим, вы хотите скопировать первую таблицу sourceSet в destinationSet.
Назовите его как
DataTable destinationTable = CopyDataTable(sourceSet.Tables[0], sourceSet.Tables[0].Rows.Count);
DataSet destinationSet = new DataSet();
destinationSet.Tables.Add(destinationTable);
Ответ 3
Это должно работать для вас
X.Tables.Add(Y.Tables[<tablename|index>].Copy());
Ответ 4
IEnumerable<DataRow> query = from sourceTbl in sourceTbl.AsEnumerable()
where [any condition you want]
select order;
DataTable boundTable = query.CopyToDataTable<DataRow>();
Я не уверен, если я правильно понял ваш вопрос. Надеюсь, что этот код поможет