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 :

BDD Access - mon code est trop lent !


Sujet :

C#

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 3
    Points : 3
    Points
    3
    Par défaut BDD Access - mon code est trop lent !
    Bonjour à tous.

    J'ai écris du code mais il est beaucoup trop lent, j'aurai besoin de l'avis d'experts !

    Je souhaiterai écrire un programme qui vérifie chaque entrée d'une vieile base de données (sous access). Cette base de données contient une correspondance @mac / noport pour chaque switch d'une entreprise. J'ai écris du code qui me récupère les informations à jour (via telnet) et me retourne ces informations sous forme d'un tableau de 4 colonnes (vlan, @mac, noport, nomduswitch) et qui fait en général 500 à 800 lignes pour un switch. Il y a une trentaine de switch dans l'entreprise.

    Pour concevoir mon programme j'ai pensé à faire ainsi :

    1) Connexion telnet au switch et récupération de la configuration sous forme d'un tableau (~600 lignes)
    2) Recopie de ce tableau dans une table
    3) On recommence pour tous les autres switchs
    4) Requete SQL pour chaque ligne de la vieile table qui vérifie dans la nouvelle table que les informations sont correctes

    J'en suis à l'étape 2 et le code que j'ai écris est très lent !! En effet, il faut 1 minute pour recopier un tableau de 800 lignes dans une table ! Je vous met le code pour que vous jetiez un oeil, j'espère que des malins pour m'aguiller (je me suis aperçu que ce sont les 3 dernières lignes qui font ramer le code).

    Voici mon code :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    //On parcourt la table
                    for (int j = 0; j < resultat.GetLength(0); j++)
                    {
                        //On fait bouger la progressbar
                        toolStripProgressBar1.Value++;
     
                        //Recopie
                        TabTxtbox[0].Text = resultat[j, 0];
                        TabTxtbox[1].Text = resultat[j, 1];
                        TabTxtbox[2].Text = resultat[j, 2];
                        TabTxtbox[3].Text = nom_sw[i];
     
                        //On prend toute la table
                        SqlSearch = "select * from " + listBox_tables.SelectedItem;
     
                        //Déclaration du data adapteur
                        OleDbDataAdapter DtaGrid = new OleDbDataAdapter(SqlSearch, Conn);
     
                        //Selection ou ajout de la ligne
                        DtrGrid = DtsGrid.Tables[Convert.ToString(listBox_tables.SelectedItem)].NewRow();
     
                        //On parcourt les valeurs
                        for (int i = 0; i < DttGrid.Columns.Count; i++)
                        {
                            DtrGrid[i] = TabTxtbox[i].Text;
                        }
     
                        //Ajout de la ligne à la table
                        DtsGrid.Tables[Convert.ToString(listBox_tables.SelectedItem)].Rows.Add(DtrGrid);
     
                        //On maj la base
                        CmdGrid = new OleDbCommandBuilder(DtaGrid);
                        DtaGrid.UpdateCommand = CmdGrid.GetUpdateCommand();
                        DtaGrid.Update(DtsGrid, Convert.ToString(listBox_tables.SelectedItem));
                    }

  2. #2
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    C'est bon j'ai trouvé !

    L'astuce est de nettoyer le cache à chaque passage, car plus celui-ci est plein plus c'est long pour enregistrer dans la base.

    Ainsi, je passe de 58 secondes à 6 secondes pour remplir 800 lignes dans ma base !

    Je poste le code pour les intéressés :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    //On crée la requête
                    SqlSearch = "SELECT * FROM confsw";
     
                    //Dataadaptater
                    DtaGrid = new OleDbDataAdapter(SqlSearch, Conn);
     
                    //On vide le cache
                    DtsGrid.Clear();
     
                    //On remplit la dataset avec la table
                    DtaGrid.Fill(DtsGrid, "confsw");
     
                    //On parcourt la table
                    for (int j = 0; j < resultat.GetLength(0)-1; j++)
                    {
                        //On fait bouger la progressbar
                        toolStripProgressBar1.Value++;
     
                        //On crée une nouvelle ligne
                        DtrGrid = DtsGrid.Tables[listBox_tables.SelectedItem.ToString()].NewRow();
     
                        //On recopie dans cette ligne
                        DtrGrid[0] = resultat[j, 0];
                        DtrGrid[1] = resultat[j, 1];
                        DtrGrid[2] = resultat[j, 2];
                        DtrGrid[3] = nom_sw[i];
     
                        //On ajoute cette ligne
                        DtsGrid.Tables[listBox_tables.SelectedItem.ToString()].Rows.Add(DtrGrid);
     
                        //On crée la commande
                        OleDbCommandBuilder cmd = new OleDbCommandBuilder(DtaGrid);
                        //On applique la commande
                        DtaGrid.InsertCommand = cmd.GetInsertCommand();
                        //On envoie la commande
                        DtaGrid.Update(DtsGrid, Convert.ToString(listBox_tables.SelectedItem));
                        //On vide la cache (permet d'améliorer grandement les performances)
                        DtsGrid.Clear();
                    }

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

Discussions similaires

  1. mon ordinateur est trop lent
    Par kawther dans le forum Sécurité
    Réponses: 3
    Dernier message: 21/12/2008, 20h03
  2. Réponses: 5
    Dernier message: 23/05/2007, 10h25
  3. Pourquoi mon code est plus lent que Arrays.sort
    Par alexis779 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/12/2006, 12h44
  4. [VB.Net 1.1/ASP.Net/Excel] Pourquoi mon exécution de code est si lente ?
    Par calison3 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 12/08/2006, 12h41
  5. [Access] Mon application est détruite !!!
    Par mathias dans le forum Access
    Réponses: 4
    Dernier message: 26/06/2003, 14h14

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