2009-03-23 6 views
2

J'ai un DataSet qui contient 2 DataTable liés (maître et détails). Je souhaite copier les données correspondant à mon filtre (par exemple, la colonne de données de base A = "XXX") vers un autre DataSet.Le moyen le plus rapide de faire une boucle et de copier des données d'un DataSet vers un autre DataSet

Maintenant, j'ai trouvé que ce processus prend très très longtemps. (environ une heure pour les enregistrements 1k)

Je veux savoir comment améliorer ce temps de traitement?

Merci, Ek

+0

Cela n'a pas de sens. Si vous avez un DataSet, cela signifie qu'il est en mémoire et avec des enregistrements 1K, même si vous bouclez encore et encore et que vous comparez chaque ligne 10 fois, cela ne prendra toujours pas une heure. Afficher le code – Ruslan

Répondre

2

Je dirais que copier 1000 enregistrements ne devrait prendre que quelques millisecondes. Assurez-vous qu'il n'y a aucun événement de tir ou DataBindings faire des choses étranges .. Peut-être que vous devriez essayer sans les relations, mais je crois que enforcecontraints = false également désactiver la vérification de clé étrangère ..

Les copies de code suivant un ensemble complet de données très rapide:

fDstDataSet.EnforceConstraints = false; 
foreach (DataTable fSrcTable in fSrcDataSet.Tables) 
{ 
    DataTable fDstTable = fOpenOrders.Tables[fSrcTable.TableName]; 
    foreach (DataRow fSrcRow in fSrcTable.Rows) 
    { 
     fDstTable.ImportRow(fSrcRow); 
    } 
} 
fDstDataSet.EnforceConstraints = true; 
+0

EnforceConstraints sur un DataSet comme celui-ci est seulement la contrainte de l'ensemble de données en mémoire, pas de retour aux contraintes de base de données réelles. Si vous avez une table simple remplie à partir d'un DataAdapter, il n'y a généralement aucune contrainte présente. –

1

Vous pourriez vouloir essayer;

myDataSet.Tables[0].Select("A = 'xxx'"); 

qui retourne DataRow[]

0

Vous pourriez gagner un certain avantage en décrivant votre problème plus en détail - il peut y avoir une meilleure option dupliquer alors vos données.

Si vous voulez vraiment aller dans cette voie, vous voudrez peut-être jeter un oeil à la classe DataView:

http://msdn.microsoft.com/en-us/library/system.data.dataview.aspx

Cela vous permettra d'extraire des données basées sur un filtre d'un datatable. Le DataView a aussi une méthode Totable:

http://msdn.microsoft.com/en-us/library/system.data.dataview.totable.aspx

Cela renverra un datatable, sur la base des lignes sélectionnées dans le DataView.

Cela devrait fonctionner mieux que votre version, même si je ne suis pas sûr si d'autres options fourniront à nouveau des implémentations plus rapides. Je crois que le DataTable.Select ci-dessus fonctionnera mieux que le DataView

Questions connexes