web-dev-qa-db-fra.com

Copier DataTable d'un DataSet à un autre

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?

22
MrCatacroquer

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.

64
stakx

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);
3
naveen

Cela devrait fonctionner pour vous

X.Tables.Add(Y.Tables[<tablename|index>].Copy());
2
V4Vendetta
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

1
RaM