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

Windows Forms Discussion :

insertion dans une BD trop lente


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 33
    Points : 26
    Points
    26
    Par défaut insertion dans une BD trop lente apartir d'1 fichier txt
    J'ai un fichier txt de t'aille 1 mo contenant 905 ligne
    j'ai exporté son contenu avec File.ReadAllLines(path) puis
    j'ai selectionné les ligne par un foreach
    j'ai enlevé les espace avec un split
    le probléme c que l'insertion ,dans une bd, ligne par ligne et trop lente
    est ce que c possible d'inseré toute les ligne par une seule commande ou........?
    est ce que un dataApdater résoudrer le probléme?
    merci

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Montre nous ton code car pour un fichier aussi petit, je comprend pas que cela soit lent pour insérer dans la BDD....

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 33
    Points : 26
    Points
    26
    Par défaut voila le 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
     
           string chemin(string aer)
            {
                **************************
                return che;
            }  
     
            private void button1_Click(object sender, EventArgs e)
            {   
                //pour obtenire le chemin du fichier
     
              string p = @chemin("\\xxxxxxxx");
                //faire l'insertion dans la bd
    		insert(p);
     
    	 p = @chemin("\\yyyyyyyyyyyy");
               insert(p);
                p = @chemin("\\zzzzzzzzzzzzzzzzzzz");
               insert(p);
     
            }
        }
    }
     void insert(string path)
            {
                int rs;
     
    	//verifie si le fichier dans le chemain spésifier existe ou non
                OdbcConnection cn = new OdbcConnection("Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\\aaaaaaaaaa\\DB.mdb");
                if (File.Exists(path) == true)
                {
     
                    try
                    {
     
                        cn.Open();
                    }
                    catch
                    {
                        MessageBox.Show("Failed to connect to data source", "DB");
                    }
                    finally
                    {//extraction de tout le document
                        string[] readText = File.ReadAllLines(path);
                        //extraction ligne par ligne
                        foreach (string s in readText)
                        { //supprission des espaces
                            string[] stringSeparators = new string[] { "	" };
                            string[] result = s.Split(stringSeparators, StringSplitOptions.None);
     
    			OdbcCommand comm = new OdbcCommand("insert into SSP2006(Caisse,Datecaisse,NF,MTF) values(?,?,?,?)", cn);
                            comm.Parameters.Add("Caisse", Convert.ToInt32(result[0]));
                            comm.Parameters.Add("Datecaisse", result[1]);
                            comm.Parameters.Add("NF", @Convert.ToInt32(result[2]));
                            comm.Parameters.Add("MTF", @Convert.ToDouble(result[3]));
                            rs = comm.ExecuteNonQuery();
                            comm.Parameters.Clear();
     
     
                        } 
     
                    } cn.Close();
                    int i = 0;
                    while (i < 7000)
                    {
                        PB1.Value = i;
                        i = i + 1;
                    }
                }
                else MessageBox.Show("Vérifier le date du fichier", "erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
     
     
            }

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 166
    Points : 144
    Points
    144
    Par défaut
    En utilisant une transaction ca ira deja bcp mieux normalement/

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 33
    Points : 26
    Points
    26
    Par défaut explique
    En utilisant une transaction ca ira deja bcp mieux normalement/
    comment faire cette transaction

  6. #6
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Utilise OleDbConnection/OledDbCommand à la place de OdbcConnection/OdbcCommand. C'est mieux approprié pour les bases de données Access.


    Et une petite remarque, on utilise plutôt le finally pour libérer les ressources et non pour effectuer un long traitement qui pourrait générer une exception. Le bloc try est fait pour ça.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 33
    Points : 26
    Points
    26
    Par défaut re
    oui sa diminue un peut le temp d'insertion mais c toujour trop lent
    y a pas une méthode pour inseré toute les ligne avec une seule opération?????
    merci

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 166
    Points : 144
    Points
    144
    Par défaut
    Alors pour faire une transaction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    OleDbTransaction  tr = myConnection.BeginTransaction();
    //ensuite tu attribue ta transaction a ta oledccommand;
    MyCommand.Transaction = tr;
    //puis  a la fin de toute t insertion tu fais un
    tr.Commit();
    Sionon en regardant ton code je vois que tu recreer a chaque fois ta command donc ta base soit faire un prepare a chaque fois donc je pense que tu devrais plutot faire ta boucle comme ceci :
    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
     
    OdbcCommand comm = new OdbcCommand("insert into SSP2006(Caisse,Datecaisse,NF,MTF) values(?,?,?,?)", cn);
     foreach (string s in readText)
                        { //supprission des espaces
                            string[] stringSeparators = new string[] { "	" };
                            string[] result = s.Split(stringSeparators, StringSplitOptions.None);
     
     
                            comm.Parameters.Add("Caisse", Convert.ToInt32(result[0]));
                            comm.Parameters.Add("Datecaisse", result[1]);
                            comm.Parameters.Add("NF", @Convert.ToInt32(result[2]));
                            comm.Parameters.Add("MTF", @Convert.ToDouble(result[3]));
                            rs = comm.ExecuteNonQuery();
                            comm.Parameters.Clear();
     
     
                        }
    Voila voilou donc si tu as besoin d'autre explication n'hesite pas.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 33
    Points : 26
    Points
    26
    Par défaut re
    j'ai fait la transaction avec se code mais il ne fait pas l'insertion dans la bd
    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
    OleDbCommand comm = new OleDbCommand("insert into SSP2006(Caisse,Datecaisse,NF,MTF) values(?,?,?,?)", cn);
                        OleDbTransaction tr = cn.BeginTransaction();
     
     
     
                        foreach (string s in readText)
                        { //supprission des espaces
                            string[] stringSeparators = new string[] { "	" };
                            string[] result = s.Split(stringSeparators, StringSplitOptions.None);
     
     
                            comm.Parameters.Add("Caisse", Convert.ToInt32(result[0]));
                            comm.Parameters.Add("Datecaisse", result[1]);
                            comm.Parameters.Add("NF", @Convert.ToInt32(result[2]));
                            comm.Parameters.Add("MTF", @Convert.ToDouble(result[3]));
     
                            //ensuite tu attribue ta transaction a ta oledccommand;
                            comm.Transaction = tr;
                            comm.Parameters.Clear();
     
     
                        }//puis  a la fin de toute t insertion tu fais un
     
                        tr.Commit();
                    }
                    catch
                    {
                        MessageBox.Show("Failed to connect to data source", "FGCATERING1");
                    }
                    finally
                    {
     
                        cn.Close();
     
                    }

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 166
    Points : 144
    Points
    144
    Par défaut
    tu as oublier le comm.executenonquery()

  11. #11
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 33
    Points : 26
    Points
    26
    Par défaut re
    Merci j'ai ajouter ExecuteNonQuery();
    il ya une amélioration
    mais ca reste toujour lent

  12. #12
    Membre régulier Avatar de DonkeyMaster
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 95
    Points : 110
    Points
    110
    Par défaut
    De plus, tu es sûr que ton goulot d'étranglement vient de l'execution des requêtes SQL? Tu pourrais vérifier que ton algorithme qui prépare les données n'est pas encore plus lent.

    Tu pourrais te passer de Parameters.Clear(). Il te suffirait d'assigner les valeurs de tes paramètres à l'intérieur de ta boucle, ce qui fera une sacrée dose de création d'objets en moins.


    Est-ce que tu as des index sur tes tables? ça aide pas mal.
    Quant à ta requête SQL, peut-être que c'est ce genre de syntaxe que tu cherches?

    http://msdn2.microsoft.com/en-us/library/ms188365.aspx


    Citation Envoyé par MSDN
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BULK INSERT AdventureWorks.Sales.SalesOrderDetail
       FROM 'f:\orders\lineitem.tbl'
       WITH 
          (
             FIELDTERMINATOR =' |',
             ROWTERMINATOR =' |\n'
          )

  13. #13
    Membre régulier Avatar de DonkeyMaster
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 95
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par jouidos
    slt

    le probleme c que je n'arrive pas a inseré le contenue d'un fichier txt dans une bd access rapidement

    l'insertion ligne par ligne et trop lente

    pour "BULK INSERT" je ne sais po comment l'utilisé
    Merci
    Citation Envoyé par jouidos
    pour "BULK INSERT" je ne sais po comment l'utilisé
    http://msdn2.microsoft.com/fr-fr/library/ms188365.aspx
    Il te faudra bien tôt ou tard apprendre à lire la doc.

    Tu avais spécifié qu'il s'agissait d'une base de données Access? Tu n'as pas moyen de changer pour Sql Server ou même pour MySql? N'importe quelle autre base de données?

    Bref. Je ne connais pas la réponse à ta question, alors voici comment j'ai fait pour trouver:

    1. moteur de recherche: "Access Bulk Insert"
    2. cliquer sur le premier résultat
    3. j'ai appris deux trucs intéressants. Premièrement, il y a un utilitaire dans Access pour importer des données depuis un fichier (remarquez que ça y est aussi sur Sql Server). Deuxièmement, il existe une fonction appelée TransferText.
    4. Retour à ton moteur de recherche préféré: "Access TransferText"
    5. Là, j'ai vu que le deuxième résultat pointait sur la FAQ Access de Développez.com! chouette, je me dis. Mais en fait, non, il y a juste une réponse qui est encore plus courte que la réponse.
    6. Tiens, ça me donne une idée. Et si je cherchais sur les forums de Développez.com?
    7. Hop, je tape "transfertext" et je regarde les threads avec la balise [Résolu]
    8. je ne peux pas essayer à ta place, mais j'en ai trouvé quelques-uns qui s'en sont sortis. Et toi, y arriveras-tu?

    Alors, un peu de plus de courage, s'il te plaît.

    Par contre, tu peux toujours poser des questions.

    PS: ce qui m'a le plus mis en rogne, c'est le fait d'avoir été contacté par MP
    PS2: je n'ai jamais programmé sur Access, et je ne suis pas sur le point de m'y mettre

  14. #14
    Membre régulier Avatar de DonkeyMaster
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 95
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par jouidos
    Merci pour tout
    actuellement j'effectue mon projet de fin d'etude
    et ce probleme et un sous module du pfe je voulé enticipé un peut les chauses
    bon je travail sur access temporairement mais je vais migré vers sql server 2000 bientôt aprés avoir fini le cahier de charge et la conception

    1000000 Merci
    ça ne me dit pas si mes conseils ont marché ou pas.
    D'accord, donc tu vas pas utiliser Access. ça me rassure.
    Perso, je préfère utiliser directement Sql Server et coder quelque chose qui va taper dedans. Avec un DataGridView WinForms, ça prend 15-30 minutes à faire et ça marche plus ou moins bien, si tu esquives toutes les sources de problèmes.

    Bon courage pour ton PFE.

Discussions similaires

  1. [debutant]insertion dans une BDD
    Par EssaiEncore dans le forum ASP
    Réponses: 7
    Dernier message: 10/02/2005, 14h58
  2. INTERBASE 5.5 insertion dans une colonne BLOB
    Par mariustrezor dans le forum Bases de données
    Réponses: 4
    Dernier message: 29/10/2004, 18h06
  3. Extraction d'un .txt et Insertion dans une table
    Par PoPmiSiR dans le forum Access
    Réponses: 8
    Dernier message: 28/10/2004, 19h13
  4. Détection insertion dans une Table
    Par abelman dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/07/2004, 14h24
  5. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34

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