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 :

Optimiser une insertion en masse dans une DataRowCollection


Sujet :

C#

  1. #1
    Membre habitué Avatar de obitskater
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2008
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2008
    Messages : 163
    Points : 132
    Points
    132
    Par défaut Optimiser une insertion en masse dans une DataRowCollection
    Bonjour à tous,

    J'ai un objet contenant une DataRowCollection nommé Rows.
    J'ai un problème de performance lorsque j'ai un très gros nombre de ligne à insérer dans cet objet (60000).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
     
    //DataGridView améliorée
    public class MaGrille
    {
     
    //........
     
    public void BindWithDataTable(DataTable maTable)
    {
    DataRow row;
    foreach(DataRow rowSource in maTable.Rows)
    {
        //obtient une ligne au format de la grille
        row = this.NewRow();
        //n'insère que des lignes vides pour le moment
        this.Rows.Add(row);
    }
    }
     
    //........
     
    }
    J'ai pu me rendre compte en mettant une trace dès que 500 nouvelles lignes ont été ajoutées, que plus on est loin dans la boucle, plus l'intervalle de temps est grand pour insérer 500 nouvelles lignes. Je pense donc que le problème de performance vient du fait que la DataRowCollection recopie à chaque fois toutes ses entrées (DataRow) pour agrandir sa taille.

    C'est pourquoi je cherche un moyen de définir la taille de ma DataRowCollection avant d'y insérer des lignes (que je connaît avant évidemment). Une sorte de Redim Preverse mais en C# et pour une DataRowCollection.

    Si vous avez des pistes je suis preneur. Merci d'avance

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 172
    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 172
    Points : 25 112
    Points
    25 112
    Par défaut
    utilise une collection plus simple plutot que cette classe plus complexe
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    A quoi sert ce DataRowCollection ?
    Je me demande si passer par un dataview ne serait pas plus efficace ?
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  4. #4
    Membre habitué Avatar de obitskater
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2008
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2008
    Messages : 163
    Points : 132
    Points
    132
    Par défaut
    En fait ma grille en question s'agit d'une grille d'un éditeur tiers : la TrueDbGrid de Component One.
    Et cette DataRowCollection est une de ses propriétés, que je ne peux donc pas changer, et que je suis obligé d'utiliser pour manipuler ses lignes.

  5. #5
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Quelle misére !

    Mais tu veux dire que ce TrueDbGrid n'accepte pas d'autre datasource qu'un DataRowCollection que tu dois lui preparer a la main ?

    Je connaissais ce TrueDbGrid en 1998 sous VisusalStudio 6 je crois ...

    Depuis .NET 2.0 je trouve que le DataGridView et largement plus simple a utiliser en plus tu peux lui mettre comme datasource la pluspart des collections que tu veux

    DataTable, DataView, List, etc..
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  6. #6
    Membre habitué Avatar de obitskater
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2008
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2008
    Messages : 163
    Points : 132
    Points
    132
    Par défaut
    Si, ce contrôle accepte un grand nombre de dataSource, mais les contraintes du projet font que je ne peux passer par de DataSource, et que je dois garder la grille dans un état unbound.

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 172
    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 172
    Points : 25 112
    Points
    25 112
    Par défaut
    le datasource ne veut pas dire binding ni répercussion des modifications
    ca sert juste à indiquer ou trouver les données

    un dataset par contre oui c'est autre chose
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Salut,

    t'as pas une méthode du style SuspendLayout ou SuspendBinding sur ta TrueDbGrid ? Là, il y a des chances qu'elle se redessine à chaque ajout de ligne.
    ಠ_ಠ

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 172
    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 172
    Points : 25 112
    Points
    25 112
    Par défaut
    ou beginedit et endedit des fois

    m'enfin s'il est aussi bien codé que le truedbgrid de vb6 tu vas pas aller loin ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre habitué Avatar de obitskater
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2008
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2008
    Messages : 163
    Points : 132
    Points
    132
    Par défaut
    Impecc Guulh, c'était exactement ça! J'ai encadré ma boucle par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    maGrid.suspendBinding();
     
    foreach(....)
    {
    //.......
    }
     
    maGrid.ResumeBinding();
    Et ça se fait en une fraction de seconde. Merci beaucoup à vous tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Insert en masse dans une table avec Hibernate
    Par goomie dans le forum Hibernate
    Réponses: 2
    Dernier message: 08/05/2011, 23h47
  2. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  3. [ASE12.5]Insertion en masse dans une table
    Par jfmerveille dans le forum Adaptive Server Enterprise
    Réponses: 6
    Dernier message: 03/12/2007, 15h14
  4. Insertion en masse dans une table
    Par scheu dans le forum Administration
    Réponses: 5
    Dernier message: 04/10/2007, 17h33
  5. Réponses: 4
    Dernier message: 09/07/2007, 12h03

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