J'essaie d'ajouter à un nouveau DataSet X un DataTable qui se trouve à l'intérieur d'un DataSet Y différent. Si je l'ajoute directement, j'obtiens l'erreur suivante:
DataTable appartient déjà à un autre DataSet.
Dois-je cloner le DataTable et y importer toutes les lignes, puis ajouter le nouveau DataTable au nouveau DataSet? Existe-t-il un moyen meilleur/facile de le faire?
Il existe deux façons simples de procéder:
DataTable.Copy
Au lieu de DataTable.Clone
, utilisez DataTable.Copy
pour créer une copie de votre table de données; puis insérez la copie dans la cible DataSet
:
dataSetX.Tables.Add( dataTableFromDataSetY.Copy() );
DataSet.Merge
Vous pouvez également utiliser DataSet.Merge
pour cela:
dataSetX.Merge(dataTableFromDataSetY);
Notez cependant que si vous allez utiliser cette méthode, vous voudrez peut-être vous assurer que votre cible DataSet
ne contient pas déjà une table du même nom:
Si le DataSet cible ne contient pas de table du même nom, une nouvelle copie de la table est créée à l'intérieur de l'ensemble de données;
Si une table du même nom est déjà dans l'ensemble de données cible, elle sera fusionnée avec celle passée à Merge
, et vous vous retrouverez avec un mélange des deux.
Utilisez cette fonction générique
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;
}
Supposons que vous souhaitiez copier la première table de sourceSet vers destinationSet.
Appelez ça comme
DataTable destinationTable = CopyDataTable(sourceSet.Tables[0], sourceSet.Tables[0].Rows.Count);
DataSet destinationSet = new DataSet();
destinationSet.Tables.Add(destinationTable);
Cela devrait fonctionner pour vous
X.Tables.Add(Y.Tables[<tablename|index>].Copy());
IEnumerable<DataRow> query = from sourceTbl in sourceTbl.AsEnumerable()
where [any condition you want]
select order;
DataTable boundTable = query.CopyToDataTable<DataRow>();
Je ne sais pas si j'ai bien compris votre question. J'espère que ce code vous aidera