C#-mySQL Programme trop long à s'executer.

Résolu/Fermé
ptisephy Messages postés 74 Date d'inscription jeudi 4 décembre 2008 Statut Membre Dernière intervention 8 novembre 2022 - Modifié le 29 juil. 2022 à 20:50
ptisephy Messages postés 74 Date d'inscription jeudi 4 décembre 2008 Statut Membre Dernière intervention 8 novembre 2022 - 8 nov. 2022 à 11:37

Bonjour,

j'ai un soucis, avec mon programme. J'ai une application windowsform, toute simple, avec un bouton pour aller chercher un fichier , un bouton parcourir pour choisir un dossier de destination, pour créer un fichier excel en sortie et un bouton pour "lancer le traitement".
 

j'ai également mis une progressbar afin de voir le résultat., voici le principe de fonctionnement :

une fois mon fichier choisi, mon programme va parcourir chaque ligne du fichieret je souhaite recupérer le siren toutes les 14 lignes ( voir partie dans le code recupération des sirens).

Ceci fait, sur un fichier échantillon, j'ai bien tous les siren dans mon tableau.

Ensuite je vais parcourir mon tableau faire une requete qui va prendre pour condition sirens[a] et après je vais récupérer le résultats de la requete dans des variables, puis je constitut mon fichier excel.

Le problème : quand je choisi un fichire petit, avec moins de  500 lignes, ça marche, mais si j'en choisi un plus volumineux, mon programme tourne puis s'arrete et plus rien ne marche. Le soucis c'est qu'en production je vais avoir des fichires de 50 000 lignes.

J'ai fais la monté de version de visual studio 2022 mais ça n'a rien changé et j'utilise le framework .net 4.7.2.

 
    private void btn_start_ficExcel_Click(object sender, EventArgs e)
        {
            // Set Minimum to 1 represente la 1ere ligne
            mabarre.Visible = true;
            mabarre.Minimum = 1;
 
            string FileToRead = txtbox_entree.Text;
 
            /*
                RECUPERATION DES SIRENS
             */
 
            String[] lines2 = File.ReadAllLines(FileToRead);
            List<String> sirens = new List<String>();
            for (Int32 index = 2; index < lines2.Count(); index += 14)
            {
                if (lines2[index].Substring(0, 5) == "DT1DT")
                {
                    sirens.Add(lines2[index].Substring(6, 14));
 
                }
 
            }
            // Set Maximum  - correspond au nombre de ligne du fichier
            mabarre.Maximum = File.ReadAllLines(FileToRead).Length;
            // Set the initial value of the ProgressBar.
            mabarre.Value = 1;
            // Set the Step property - 1 chaque ligne lu
            //mabarre.Step = 1;
            /*
               Connexion à la base mysql
            */
            string server = "xxxxxxxxx";
            string database = "xxxxxx";
            string user = "xxxxxxx";
            string password = "xxxxxxxx";
            string port = "xxxxxxx";
 
            string connString = "Server=" + server + "; Port=" + port + ";Database=" + database + ";Uid=" + user + ";Pwd=" + password + ";SSL Mode=None;default command timeout=0";
            string marequete = "";
 
 
 
 
            conn = new MySqlConnection(connString);
            try
            {
                conn.Open();
            }
            catch (MySqlException erreur)
            {
                MessageBox.Show(erreur.ToString());
                conn.Close();
            }
 
 
            /*
           CREATION ET OUVERTURE DU FICHIER EXCEL
        */
            DateTime today = (DateTime.Now).AddMonths(-1);
            string d = Convert.ToString(today);
            string yyyy = d.Substring(6, 4);
            string mm = d.Substring(3, 2);
            string jour = d.Substring(0, 2);
            string heure = d.Substring(11, 2);
            string minute = d.Substring(14, 2);
            string seconde = d.Substring(17, 2);
 
            repexc = folderBrowserDialog2.SelectedPath + "\\mondossier" + yyyy + mm + jour + "_" + heure + minute + seconde + ".xlsx";
            Microsoft.Office.Interop.Excel.Application xla = new Microsoft.Office.Interop.Excel.Application();
            xla.Visible = false;
            Workbook wb = xla.Workbooks.Add(XlSheetType.xlWorksheet);
            //WorksheetCollection worksheets = xla.Worksheets;
            Worksheet ws = (Worksheet)xla.ActiveSheet;
            ws.Cells[1, 1] = "colonne 1";
            ws.Cells[1, 2] = "colonne 2"; 
            ws.Cells[1, 3] = "colonne 3";
			...............
			...............
			//je créé les différents entete
 
            UneCellule = ws.get_Range("A1", "M1");
            ws.Columns.Font.Name = "MS Sans Serif";
            ws.Columns.Font.Size = 12;
 
 
            string nomcol1 = "";
            string nomcol2 = "";
            string nomcol3 = "";
			........
			....... //je créé les différentes variables
 
 
            /*
                Parcours de la base de données et récupération du résultat
            */
 
			
            for (int a = 2; a < sirens.Count; a++) //
            {
 
                marequete=" select t0.tesccpcod, "+
               "t0.col1, "+
               "t0.col2, " +
               "t0.col3, " +
               "t0.xxxx, " +
               "t0.xxxx, " +
               "t1.xxxx," +
               "t2.xxxx," +
               "t2.xxxx," +
               "t2.xxxx," +
                "t1.xxxx," +
                "t1.xxxxx," +
                "t1.xxxx " +
                "from matable0 t0 " +
                 "INNER join matable1 t1 on t1.xxxx = t0.xxx " +
                 "inner join matable2 t2 on t2.xxxx = t0.xxxx " +
                 "inner join matable3 t3 on t3.xxxx = t0.xxxx " +
                 "inner join matable4 t4 on t4.xxxx = t0.xxxx " +
                 "where t0.num ='" + sirens[a] + "'";
 
                MySqlCommand cmd = new MySqlCommand(marequete, conn);
                  monreader = cmd.ExecuteReader();
 
                if (monreader.Read())
                {
                    nomcol1 = monreader.GetString(0);
                    nomcol2 = monreader.GetInt64(1).ToString();
                    nomcol3 = monreader.GetString(2);
                   ........ //jusque là pas de soucis je recupère mon résultat
 
 
                    //je rempli mon tableau pour rempli le fichier excel
                    ws.Cells[a, 1] = nomcol1;
                    ws.Cells[a, 2] = nomcol2;
					...............
 
 
                }
                else
                {
                    ws.Cells[a, 2] = sirens[a];//si ko, dans mon fichier excel je ne met que l'identifiant
 
                }
                   mabarre.PerformStep(); //je rempli ma barre
                   monreader.Close();
 
            }//fin du for
                
 
			
			
            ws.SaveAs(repexc, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
            xla.Quit();
 
        }
 
 
 
    }//fin méthode

comment ça se fait que le logiciel plante si c'est des fichiers plus lourds ?

N'y a t-il pas moyen d'optimiser mon code pour le rendre plus efficace et est ce que je m'y prend bien dans ma façon de requéter?
merci à vous.
 


Windows / Chrome 103.0.0.0

25 réponses

Utilisateur anonyme
29 juil. 2022 à 20:47

Comme je l'ai écrit plus haut, je ne fais quasiment jamais de BDD, et j'ajoute que les rares fois où j'en fait elles sont peu volumineuses et les requêtes sont simples.

Je vais donc déplacer le sujet dans le forum BDD


0
ptisephy Messages postés 74 Date d'inscription jeudi 4 décembre 2008 Statut Membre Dernière intervention 8 novembre 2022
1 août 2022 à 10:43

Bonjour à vous,

merci pour ce retour. Tu as totalement raison, c'est un export brut de données sans les liens.

L'export s'est fait d'un systeme as400 et on a créé une base mysql car l'as400 était destiné à ne plus être utilisé.

Tout Le problème est là. Effectivement j'ai quelques connaissance en base de données, pendant à peu près 3 ans et plus , j'ai fais beaucoup du sql, du requetage, donc je m'y connais un peu, seulement pour ce projet là, on m'a mis à disposition une base de données (export brut) et apres c'est debrouille toi avec ça ( c'est comme faire une tarte au sucre, sans sucre , bref ).

Voila pourquoi, nous avons créé une base de données prep, pour que je travaille dessus, et c'est là que j'ai créé mes colonnes id, mais il n'y a aucun lien logique entre les tables, car la colonne est juste en autoincremant, exemple :

table 1: 50 lignes donc dans la colonne t1.id les numeros vont de 1 à 50

table 2 : 120 000 lignes : donc t2.id les numeros vont de 1 à 120 000.

Le seul moyen ( dite moi si je me trompe pas) est d'avoir un export avec les liens entre chaque table ? 

Est il possible également d'un coup de baguette magique de palier à ce problème ? j'ai un doute sur la réponse, mais je pense que ça sera non, mais j'aimerais avoir confirmation.

Mreci beaucoup 

0
yg_be Messages postés 23399 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 décembre 2024 1 556
1 août 2022 à 11:14

Il est nécessaire d'avoir dans l'export une information qui peut servir de liens ou peut servir à recréer les liens.

Soit via un nouvel export, soit en le découvrant dans l'export déjà fait.

1
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
Modifié le 1 août 2022 à 12:13

Bonjour

Comme l'a déjà suggéré yg_be https://forums.commentcamarche.net/forum/affich-37644815-c-mysql-programme-trop-long-a-s-executer?page=1#25

Il serait préférable de créer une nouvelle discussion propre à cette problématique.

À noter que dans AS 400 il existe bien des liens entre chaque table...

Si le but est de remplacer l'as400 par une base de données mysql, je doute qu'il soit nécessaire d'y rajouter des colonnes superflues telles qu'un ID auto incrémenté. Les données présentes dans l'export devraient se suffire à elles-mêmes..

Il faudrait donc nous montrer l'intitulé des colonnes de chaque export... Et déterminer le lien entre chacun d'eux. Une colonne code, une colonne siret.. bref les données communes entre chaque fichier.

De là, tu pourras concevoir le MCD de tes tables à créer sous mysql.


0
ptisephy Messages postés 74 Date d'inscription jeudi 4 décembre 2008 Statut Membre Dernière intervention 8 novembre 2022
1 août 2022 à 14:52

Merci pour vos retour.

J'ai donc crée le post vers le lien suivant : https://forums.commentcamarche.net/forum/affich-37651558-probleme-base-de-donnees-as400-vers-mysql?uDwj2arQVVRrMcAP3dU5SqMypBdnqhBi9HU2-6mDoWI

Comme l'évoque yg_be, je pense qu'il vaudrait mieux procéder à un export propre des données, avec les liens entre chaque table, car dans le post j'ai mis la structure des tables ( issu de mysql) mais on ne peut rien utiliser comme clé primaire techniquement ..
 

merci

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ptisephy Messages postés 74 Date d'inscription jeudi 4 décembre 2008 Statut Membre Dernière intervention 8 novembre 2022
8 nov. 2022 à 11:37

bonjour ,

pour information, le problème a été résolu.

J'ai modifié ma requete, en laissant mon for, puis au lieu de faire un "If reader.read" j'ai mis un while.
 

0