Partage
  • Partager sur Facebook
  • Partager sur Twitter

Optimisation et correction d'application

C# - Winform - Mysql

    2 janvier 2013 à 14:29:38

    Bonjour,

    Je viens de finaliser une application pour un cours. J'ai rendu se travail avec beaucoup de difficulté.
    J'aimerais maintenant optimiser mon code pour qu'il soit moins lourd, plus réglementaire et surtout moins débutant.

    Description du projet:
    Créer un logiciel de gestion d'empaquetage et de mise en palette dans une société d'emballage.
    Objectif:
    Maitriser les bases du langages C#
    Concevoir une interface simple d'utilisation
    Communiquer avec une base de données (SQL)

    Matériel obligatoire:
    Visual Studio 20xx C#
    .NET Framework 4
    DB Mysql community
    Mysql Connector 6.x.x

    NE PAS UTILISER DE BRIQUE TOUTE FAITE trouvé sur les sites de références.
    UTILISER LE WEB pour poser des questions supplémentaires (en dehors des cours)

    Print screen
    Image utilisateur

    Je n'ai encore jamais vu posté de project complet sur le SDZ.
    Peut on le faire ? Je n'ai rien vu contre. Mais généralement on ne poste qu'une partie du code qui pause problème.
    Dans mon cas je n'ai pas de problème de conception mais d’optimisation...

    J'attends vos commentaires avant de poster le liens vers le zip du project.

    Merci et à bientot
    • Partager sur Facebook
    • Partager sur Twitter
      2 janvier 2013 à 14:32:53

      salut :)

      En effet il n'y a pas beaucoup de sujet ou les gens poste un code entier. Mais toi tu peux tout à fait poster ton projet en zip ou autre.

      Le seule truc c'est que tu risques de pas avoir énormément de réponses, vue qu'il faut du temps pour voir tout le code :) Puis le prof fera un retour logiquement.

      L'interfaces est sympa déjà :)
      • Partager sur Facebook
      • Partager sur Twitter
        2 janvier 2013 à 14:36:11

        Tout dépend à quel niveau tu veux que l'optimisation soit réaliser... Mais sans le code,tu te doutes bien que l'on ne peut pas grand chose pour toi.
        • Partager sur Facebook
        • Partager sur Twitter
          2 janvier 2013 à 14:59:55

          Voici le code source, et les compléments
          Suivez le README si vous n'êtes pas habitué au SGBD MYSQL

          Merci de vos premier retour.

          Je veux optimiser ma méthode d'accès au données en particulier.
          Tout mes accès DB se font dans une class avec des requêtes SQL paramétrées.

          J'aimerais aussi savoir si ma méthode pour faire une fenêtre de connexion et changer d'utilisateur est bonne
          J'aimerais bien imprimer une deuxième page dans l’aperçu d'impression
          J'utilise une variable globale pour mémoriser le nom de l'utilisateur en cours (j'aime pas mais je ne sais pas comment créer un object qui fera ca)

          Je vous laisse juger et n'ayez pas peur de critiquer :p

          Téléchargez mon project
          • Partager sur Facebook
          • Partager sur Twitter
            2 janvier 2013 à 15:32:47

            Citation

            J'utilise une variable globale pour mémoriser le nom de l'utilisateur en cours (j'aime pas mais je ne sais pas comment créer un object qui fera ca)



            Pour ca, une classe statique genre "Globals" qui contient par exemple un objet Utilisateur est suffisant.

            Ton compteur de commande,fais juste une variable et n'execute celle-ci que lorsque tu te déconnectes.Cela évitera des requêtes inutiles.

            Ta fonction d'ajout de la commande peut être largement optimisée pour les lignes de code en passant un Dictionnaire et en créant les paramètres avec une boucle,ce que tu as fais là c'est en mode barbare...
            Pareil pour l'insertion de Client.

            La boucle d'insertion des lignes de commandes,à moin que cela soit voulu est inutile surtout que les lignes de ton DGV peuvent facilement changer si tu as plusieur facon de le trier.

            Donc,oui il y a déjà beaucoup de chose à optimiser :D
            • Partager sur Facebook
            • Partager sur Twitter
              2 janvier 2013 à 17:27:27

              Citation : brucelee410

              Pour ca, une classe statique genre "Globals" qui contient par exemple un objet Utilisateur est suffisant.



              Je n'ai jamais utilisé de class statique comme cela. Est-ce quelque chose de ce genre? Je n'ai jamais implémenté cela je ne sais pas encore comment m'en servir.

              /// <summary>
                  /// Static value protected by access routine.
                  /// </summary>
                  static int _globalValue;
              
                  /// <summary>
                  /// Access routine for global variable.
                  /// </summary>
                  public static int GlobalValue
                  {
              	get
              	{
              	    return _globalValue;
              	}
              	set
              	{
              	    _globalValue = value;
              	}
              }
              



              Citation : brucelee410

              Ton compteur de commande,fais juste une variable et n’exécute celle-ci que lorsque tu te déconnectes.Cela évitera des requêtes inutiles.



              Ce logiciel a pour vocation d'être utilisé simultanément par différents utilisateurs (au minimum 2), j'ai oublié de le précisé dans le premier post.

              En conséquence, je pensais que vérifier le compteur et incrémenter le compteur de cette manière serait une bonne chose. Si je me trompe, confirme le moi et j'effectuerai la modification.

              Citation : brucelee410

              Ta fonction d'ajout de la commande peut être largement optimisée pour les lignes de code en passant un Dictionnaire et en créant les paramètres avec une boucle,ce que tu as fais là c'est en mode barbare...
              Pareil pour l'insertion de Client.



              Tu me propose de passer un dictionnaire, je ne connais pas cet "object" je me renseigne. As tu un tutoriel particulier à me faire découvrir?
              Ce que tu reproches à cette portion de code doit, je le pense, être la déclaration de mes paramètres SQL?
              Ex:
              DbParameter ParamNom = DbFactory.CreateParameter();
              ParamNom.ParameterName = "@nom";
              ParamNom.DbType = System.Data.DbType.String;
              ParamNom.Direction = System.Data.ParameterDirection.Input;
              ParamNom.Value = nom;
              DbCom.Parameters.Add(ParamNom);
              

              Ou je fais fausse route?

              Citation : brucelee410

              La boucle d'insertion des lignes de commandes,à moin que cela soit voulu est inutile surtout que les lignes de ton DGV peuvent facilement changer si tu as plusieur facon de le trier.



              Pour ma boucle d'insertion, j'insère manuelle chaque ligne de mon datagridview, il n'est pas triable sur la mainform. Le tri à l'écran est le tri dans la DB par ordre d'insertion.
              Est-ce que je dois revoir cette méthode d'insertion? Si oui, de quel manière est-ce préférable?


              Comme tu as pu le remarquer, j'utilise les commandes d'accès générique au DB fournie par le Framework.
              Est-ce la bonne méthode d'utilisation? J'ai regardé le code de mes collègues de classe et j'ai l'impression de ne pas bien gérer du tout ces éléments.

              NB: passer à LINQ via Entity Framework permettrait de nettoyer mon code ou je réussirai juste à m'obscurcir l'esprit un peu plus?



              J'attend les commentaire de tout les Zéro disponible...

              Le code n'est pas dur à comprendre même pour les débutants (qui ont parfois des idées bien meilleurs que les miennes)
              </span>

              • Partager sur Facebook
              • Partager sur Twitter
                3 janvier 2013 à 12:41:22

                Citation

                Je n'ai jamais utilisé de class statique comme cela. Est-ce quelque chose de ce genre? Je n'ai jamais implémenté cela je ne sais pas encore comment m'en servir.


                Oui,c'est ce genre de chose,mais mettre toutes tes variables static dans une classe statique te permet d'éclaircir ton code pour évité d'en avoir un peu partout dans les différentes classes de ton programme.

                Citation

                Ce logiciel a pour vocation d'être utilisé simultanément par différents utilisateurs (au minimum 2), j'ai oublié de le précisé dans le premier post.

                En conséquence, je pensais que vérifier le compteur et incrémenter le compteur de cette manière serait une bonne chose. Si je me trompe, confirme le moi et j'effectuerai la modification.


                Ok,mais si tu supprimes des lignes dans ta BDD ton comteur sera faussé et ton numéro de commande pourrais être le même qu'une autre.Tu pourrais à la place utilisé une procédure stockée pour renvoyer le nombre totale de ligne si tu dois le faire et s'il est impossible de supprimé une ligne pourquoi ne pas directement utilisé ta primary key comme numéro de commande? Imaginons que tu as 1000 clients qui entrent des 10 lignes de commandes: (1000*4)+ (1000*10)= 4000 + 10000 = 14000 requetes ca fait beaucoup juste pour rentrer 1 commande de 10 par client.

                Citation

                Tu me propose de passer un dictionnaire, je ne connais pas cet "object" je me renseigne. As tu un tutoriel particulier à me faire découvrir?
                Ce que tu reproches à cette portion de code doit, je le pense, être la déclaration de mes paramètres SQL?


                Oui, c'est bien pour celà.Le type Dictionary<string,string> te permet avec une boucle sur une KeyValuePair de créer et ajouter avec beaucoup moins de lignes de code tes paramètres.Le site de microsoft pourrait te donner quelque exemple.

                Citation

                Pour ma boucle d'insertion, j'insère manuelle chaque ligne de mon datagridview, il n'est pas triable sur la mainform. Le tri à l'écran est le tri dans la DB par ordre d'insertion.
                Est-ce que je dois revoir cette méthode d'insertion? Si oui, de quel manière est-ce préférable?


                Je parle de ceci:
                //Insertion des lignes de commandes
                            int i = 0;
                            while (i < dataGridView1.RowCount)
                            {
                                DbCommand DbCom1 = CreateCommand("INSERT INTO lignes_commandes (`PK_LIGNE`, `FK_COMMANDE`,`LIGNE`,`ETAT`) VALUES (NULL, @numerocommande1, @lignecommande,'0')");
                
                                DbParameter ParamLigneCommande = DbFactory.CreateParameter();
                                ParamLigneCommande.ParameterName = "@lignecommande";
                                ParamLigneCommande.DbType = System.Data.DbType.String;
                                ParamLigneCommande.Direction = System.Data.ParameterDirection.Input;
                                ParamLigneCommande.Value = dataGridView1.Rows[i].Cells[1].Value.ToString();
                                DbCom1.Parameters.Add(ParamLigneCommande);
                
                                DbParameter ParamNumeroCommande1 = DbFactory.CreateParameter();
                                ParamNumeroCommande1.ParameterName = "@numerocommande1";
                                ParamNumeroCommande1.DbType = System.Data.DbType.Int16;
                                ParamNumeroCommande1.Direction = System.Data.ParameterDirection.Input;
                                ParamNumeroCommande1.Value = numeroCommande;
                                DbCom1.Parameters.Add(ParamNumeroCommande1);
                
                                DbCom1.ExecuteNonQuery();
                                i++;
                
                                
                            
                            }
                

                Tu rentres des données dans ta base de donnée alors que tu as déjà tes lignes qui sont rentrées par ordre d'insertion grace a ta primary key.As-tu étudier le forme de ta BDD pour crée tous ce qu'il lui est nécessaire sans l'encombrer ou tu l'as fait à la "volée"?

                Citation

                Comme tu as pu le remarquer, j'utilise les commandes d'accès générique au DB fournie par le Framework.
                Est-ce la bonne méthode d'utilisation? J'ai regardé le code de mes collègues de classe et j'ai l'impression de ne pas bien gérer du tout ces éléments.


                Oui, c'est assez bien comme cela mais tu peux séparer l'initialisation,l'ouverture,la fermeture et la libération des ressources de ta connexion à la base de donnée pour un code un peu plus propre.Aussi utilise des try catch sinon ton programme peut planter et je viens de voir que tu as des jolis C/C dans ton MainForm.cs utilise des fonctions,elles sont faites pour ca :).
                • Partager sur Facebook
                • Partager sur Twitter
                  6 janvier 2013 à 13:37:22

                  Citation : brucelee410

                  Je parle de ceci

                  //Insertion des lignes de commandes
                              int i = 0;
                              while (i < dataGridView1.RowCount)
                              {
                                  DbCommand DbCom1 = CreateCommand("INSERT INTO lignes_commandes (`PK_LIGNE`, `FK_COMMANDE`,`LIGNE`,`ETAT`) VALUES (NULL, @numerocommande1, @lignecommande,'0')");
                  
                                  DbParameter ParamLigneCommande = DbFactory.CreateParameter();
                                  ParamLigneCommande.ParameterName = "@lignecommande";
                                  ParamLigneCommande.DbType = System.Data.DbType.String;
                                  ParamLigneCommande.Direction = System.Data.ParameterDirection.Input;
                                  ParamLigneCommande.Value = dataGridView1.Rows[i].Cells[1].Value.ToString();
                                  DbCom1.Parameters.Add(ParamLigneCommande);
                  
                                  DbParameter ParamNumeroCommande1 = DbFactory.CreateParameter();
                                  ParamNumeroCommande1.ParameterName = "@numerocommande1";
                                  ParamNumeroCommande1.DbType = System.Data.DbType.Int16;
                                  ParamNumeroCommande1.Direction = System.Data.ParameterDirection.Input;
                                  ParamNumeroCommande1.Value = numeroCommande;
                                  DbCom1.Parameters.Add(ParamNumeroCommande1);
                  
                                  DbCom1.ExecuteNonQuery();
                                  i++;
                  
                                  
                              
                              }
                  



                  Tu rentres des données dans ta base de donnée alors que tu as déjà tes lignes qui sont rentrées par ordre d'insertion grace a ta primary key.As-tu étudier le forme de ta BDD pour crée tous ce qu'il lui est nécessaire sans l'encombrer ou tu l'as fait à la "volée"?



                  Je n'utilise pas l'intégrité référentiel pour cette table (pas de foreign key).
                  Mon délais pour rendre le logiciel m'a quelque peu contraint à restreindre certain objectif.

                  Je vais néanmoins corriger ce problème au plus vite.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 mai 2019 à 0:13:21

                    bonsoir a tous! en fait j'suis nouveau dans le groupe et je voulait juste que vous puissiez M'aidai... pour être glaire je vient de crée une application disons un projet sur C# qui permet juste de géré les personnes ( leur identité comme le Nom, PostNom, preNom, sexe, DateNais, etc...) et j'ai le fait avec la base des données Mysql tout marche bien comme j'ai voulait, mais je n'y arrive pas a faire l'impression disons l'état en sortie;

                    - vraiment je besoin des vôtres aide, veilleur m'expliqué quoi fait ou que faut il faire pour que je puis m'assortirez;

                    j'utilise la version 2015 ENTERPRISE merci (e) d'avance.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 mai 2019 à 10:10:16

                      Créez votre propre sujet, SVP.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                      Optimisation et correction d'application

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown