IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Dataset : Delete Row hyper lent


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 163
    Points : 120
    Points
    120
    Par défaut Dataset : Delete Row hyper lent
    Bonjour à tous,

    J’ai un gros problème de lenteur lors de la suppression (delete) de Row dans une DataTable.

    Voici ma DataTable :


    Voici le code utilisé :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                foreach (myDataSet.LOT_NATURERow row in _ds.LOT_NATURE.Rows)
                {
                    row.Delete();
                }

    La datatable ne comporte de pas de liaison Delete on Cascade.

    Admettons qu’elle comporte 5000 rows : la boucle prend 150 secondes.
    Je ne comprends pas. Je ne sais pas d’où ça vient. J'ai essayé des SuspendBinding, EndEdit sur les BindingSource... Toutes les autres tables se vident aisément en 1 seconde…

    Voilà, si quelqu’un voit l’ombre d’une idée.

  2. #2
    Modérateur
    Avatar de Overcrash
    Homme Profil pro
    Architecte Logiciel et responsable CRM (Salesforce)
    Inscrit en
    Mai 2008
    Messages
    1 254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte Logiciel et responsable CRM (Salesforce)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 254
    Points : 1 875
    Points
    1 875
    Par défaut
    Bonsoir,

    C'est uniquement la boucle qui prend 150sec ? ou l’exécution total ?
    ---
    Overcrash

    Je ne lis pas les codes qui ne sont pas indentés.
    Merci de les messages utiles en cliquant en bas à droite du message

    Bloqué par le firewall pour accéder au chat ? Essayez avec l'adresse en direct : http://87.98.168.209/

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 163
    Points : 120
    Points
    120
    Par défaut
    C'est l'ensemble des tours de boucle : delete de 5000 rows en 150 secondes

    Contrairement à d'autres DataTables sur lesquelles je vais en supprimer 5000 en 1 seconde.

    Pour l'instant la solution peu élégante que j'ai trouvé est de supprimer celles-ci dans la base (SqlCommand) et de recharger les données de mes DataTables...

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 123
    Points : 130
    Points
    130
    Par défaut suppression ? pourquoi ?
    Bonjour,

    La suppression des tables, c'est pour faire quoi ?
    si c'est pour une suppression suite au désir de l'utilisateur de tout supprimer, c'est pas grave. En revanche, je doute que ce soit pour tout supprimer.
    Il y a dans DataSet plusieurs méthodes telles que Merge ou RejectChanges.
    Lisez la documentation sur Merge (ici) et tout particulièrement le passage avec DataRowState.
    under construction...

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    essaye de copier le contenu de la collection rows dans un list<T> puis fait le for each sur le list pour faire le delete
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 123
    Points : 130
    Points
    130
    Par défaut delete
    ce que dit Pol63 est vrai,
    le foreach sur un Rows et dans la row supprimer l'élément ?
    il faut qu'il recommence tout le processus.
    Le mieux ce serait d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while(rows.Count >0)
      rows[0].Delete();
    under construction...

  7. #7
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Et si ça venait plutôt de SQL Server ?
    As-tu essayé de regarder ce qui se passe dans ta base au moment de cette exécution avec le SQL Profiler ?

    Cela te permettrait de voir si ce n'est pas à ce niveau là.
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  8. #8
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2009
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 229
    Points : 305
    Points
    305
    Par défaut
    C'est le boucle qui cause cette lenteur, tu peux utiliser ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
         DataTable dt = new DataTable();
         dt.Rows.Remove(row);
    Accepter les critiques, c'est le premier pas pour être un bon développeur ...

Discussions similaires

  1. Line.2D hyper lent, comment dessiner plus vite ?
    Par alexandre1975 dans le forum 2D
    Réponses: 17
    Dernier message: 25/06/2008, 00h00
  2. dataset add row ne pas ajouter de clé double?
    Par gregcat dans le forum Windows Forms
    Réponses: 2
    Dernier message: 30/01/2008, 11h25
  3. [opensuse 10.3] Interface graphique hyper lente
    Par MDev25 dans le forum Administration système
    Réponses: 0
    Dernier message: 25/01/2008, 10h53
  4. delete row de ma base
    Par anisj1m dans le forum JDBC
    Réponses: 7
    Dernier message: 20/03/2007, 15h00
  5. [C# 2.0] DataGridView add/delete row ?
    Par fix105 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 30/11/2006, 16h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo