Comment clôner un DataSet ? (MAJ) et limite du compact Framework !
Suite à qq remarques concernant ma fonction j'ai pu tirer plusieurs enseignements :
- Tourne ta langue 7 fois dans ta bouche avant de blogger :)
- Il y a deux types de personnes (au moins) : ceux qui ricanent et ceux qui t'expliquent (merci à ces derniers.)
Alors que celui qui n'a jamais "merd.." me lance la première pierre.
Pour ce qui est de la technique :
Effectivement, il existe une fonction Dataset.Copy qui fait exactement ce que j'ai écrit, et en une ligne..
Ce qui me rassure c'est qu'ILDASM sur System.Data montre que la logique que j'ai utilisée est la même :)
IL_0001: callvirt instance class System.Data.DataSet System.Data.DataSet::Clone()
IL_0016: call instance class System.Data.DataTableCollection System.Data.DataSet::get_Tables()
IL_0044: callvirt instance class System.Data.DataRowCollection System.Data.DataTable::get_Rows()
IL_0064: callvirt instance void System.Data.DataTable::CopyRow(class System.Data.DataTable,
IL_006b: callvirt instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
En revanche ils n'utilisent que 2 boucles au lieu de 3 car la fonction CopyRow doit boucler sur les colonnes.
Je garderai cependant à l'esprit la méthode DataSet.Tables("Matable").ImportRow, merci à Nix
Et c'est la que je rebondit (Abracadabra, tour de passe-passe, tagadaboumboum c'est moi) :
Je suis au regret de vous annoncer que dans le CompactFramework, la méthode DataSet.Copy n'existe pas (nananère) et c'est ILDASM qui le dit ! (ya bien clône mais pas copy)
Donc je reposte ma super fonction ; )
Public Function CloneADataset(ByVal DSSource As DataSet) As DataSet
Dim oDS As New DataSet
Dim oDT As DataTable
Dim oDR As DataRow
Dim oDC As DataColumn
Dim oRowDest As DataRow
'Clonage de la structure du Dataset
oDS = DSSource.Clone
'Les boucles
For Each oDT In DSSource.Tables
For Each oDR In oDT.Rows
oRowDest = oDS.Tables(oDT.TableName).NewRow()
For Each oDC In oDT.Columns
oRowDest(oDC.ColumnName) = oDR(oDC.ColumnName)
Next
oDS.Tables(oDT.TableName).Rows.Add(oRowDest)
Next
Next
Return oDS
End Function
(Purée, je m'en sors bien sur ce coup là, espérons qu'il n'y ai pas d'autre méthode ;) sinon faites moi savoir et bâchez moi !!!)
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :