Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C# + SQL] Requête paramétrée et UserControl

    11 juin 2019 à 17:00:01

    Bonjour, bonsoir !

    Actuellement étudiant en BTS SIO, je travaille dans le cadre d'un stage, sur le développement d'un logiciel de gestion pour un EHPAD (Orpea).
    La fonctionnalité sur laquelle je travaille en ce moment, doit permettre de créer une "fiche résident". Le but étant donc de renseigner
    quelques informations sur la personne dont :

    • Nom
    • Prénom
    • Autonomie
    • Date d'entrée
    • Toutes les activités dont le résident :
      a déjà pratiqué,
      n'a jamais pratiqué mais est intéressé,
      n'est pas du tout intéressé.

    Le point où je bute est le dernier. En effet j'ai eu beaucoup de mal à visualiser un moyen de mettre en œuvre cette fonction.
    Cependant j'ai tout de même réussi à me creuser la tête et à produire quelque chose qui fonctionne... à moitié...

    Il faut savoir qu'il y a 6 catégories d'activités et au total 40 activités.

    J'ai donc dans un premier temps créé un UserControl avec les contrôles suivants :
    • Label : Pour le nom de la catégorie des activités
    • checkedListBox : Pour pouvoir cocher les activités
    • comboBox : Afin de pouvoir sélectionner un "mode" ex : a déjà pratiqué, pour toutes les activités cochées.

    Voici un aperçu :

    J'ai ensuite fait les propriétés afin d'avoir accès aux contrôles, puis, au Load du formulaire j'ai fait les requêtes suivantes :

    Cette première requête récupère tous les noms des catégories des activités, crée autant de UserControl qu'il y a de catégorie
    puis inscrit le nom dans le label :

                using (var connection = new MySqlConnection())
                {
                    connection.ConnectionString = "server=**;Port=3306; userid=**; password=**; database=orpeafauriel_bdd";
                    connection.Open();
     
                    const string query = "SELECT CAT_LIBELLE FROM CATEGORIES"; // Récupère le nom des catégories des activités
     
                    using (var cmd = new MySqlCommand(query, connection))
                    {
                        using (var reader = cmd.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                // Créer un UserControl tant qu'il y a de catégorie soit 6 et affiche le nom dans le label.
                                _userControl1 = new UserControl1();
                                _userControl1.LblCategM.Text = reader.GetString("CAT_LIBELLE");
                                flowLayoutPanel1.Controls.Add(_userControl1);
     
                                // Ajoute à chaque comboBox des 6 UserControls les 3 possibilités avec un ID (pour la BDD)
                                _userControl1.ComboCotationM.Items.Add(new ObjectItemId("++", "A déjà pratiqué"));
                                _userControl1.ComboCotationM.Items.Add(new ObjectItemId("+-", "N'a jamais pratiqué mais est intéressé"));
                                _userControl1.ComboCotationM.Items.Add(new ObjectItemId("--", "N'est pas du tout intéressé"));
     
                                // Exécute la requête suivante
                                GetActivites();
                            }
                        }
                    }
                }


    Cette requête est chargée de récupérer toutes les activités pour chaque catégorie.

                using (var connection2 = new MySqlConnection())
                {
                    connection2.ConnectionString = "server=**;Port=3306; userid=**; password=**; database=orpeafauriel_bdd";
                    connection2.Open();
     
                    // Cette requête récupère toutes les activités en fonction du nom de la catégorie inscrite dans le label
                    // Si le label = Artistiques, alors toutes les activités de cette catégorie seront inscrites dans la CheckedListActivites
     
                    const string query2 = "SELECT ACT_LIBELLE FROM ACTIVITES WHERE ACT_CODE_CATEG = (SELECT CAT_CODE FROM CATEGORIES WHERE CAT_LIBELLE = @CAT_LIBELLE)";
     
                    using (var cmd2 = new MySqlCommand(query2, connection2))
                    {
     
                        cmd2.Parameters.Add(new MySqlParameter("@CAT_LIBELLE", MySqlDbType.VarChar));
                        cmd2.Parameters["@CAT_LIBELLE"].Value = _userControl1.LblCategM.Text;
     
                        using (var reader2 = cmd2.ExecuteReader())
                        {
                            while (reader2.Read())
                            {
                                // Ajoute toutes les activités de la catégorie en question dans la CheckedList
                                _userControl1.CheckedListActivites.Items.Add(reader2.GetString("ACT_LIBELLE"), false);
                            }
                        }
                    }
                }

    On obtient donc :

    Le problème maintenant et la question est la suivante :
    Comment puis-je insérer tout ça dans la table de ma base de données ?

    J'ai tenté de boucler les paramètres mais sans grand succès !

                using (var mySqlConnection = new MySqlConnection())
                {
                    mySqlConnection.ConnectionString = "server=**;Port=3306; userid=**; password=**; database=orpeafauriel_bdd";
                    mySqlConnection.Open();
     
                    const string query = "INSERT INTO CENTRES_INTERET(CI_RESID, CI_CATEG, CI_ACT, CI_COTATION) " +
                                         "SELECT RESID_ID, ACT_CODE_CATEG, ACT_CODE, COTA_ID " +
                                         "FROM RESIDENTS, ACTIVITES, COTATIONS " +
                                         "WHERE RESID_NOM = @RESID_NOM AND ACT_LIBELLE = @ACT_LIBELLE AND COTA_LIBELLE = @COTA_LIBELLE";
     
                    using (var mySqlCommand = new MySqlCommand(query, mySqlConnection))
                    {
                        mySqlCommand.Parameters.Add(new MySqlParameter("@RESID_NOM", MySqlDbType.VarChar));
                        mySqlCommand.Parameters.Add(new MySqlParameter("@ACT_LIBELLE", MySqlDbType.VarChar));
                        mySqlCommand.Parameters.Add(new MySqlParameter("@COTA_LIBELLE", MySqlDbType.VarChar));
     
                        var cotationIdValue = ((ObjectItemId)_userControl1.ComboCotationM.SelectedItem).Value;
     
                        foreach (var items in _userControl1.CheckedListActivites.CheckedItems)
                        {
                            mySqlCommand.Parameters["@ACT_LIBELLE"].Value = items.ToString();
                        }
     
                        mySqlCommand.Parameters["@RESID_NOM"].Value = "BOUCHET";
                        mySqlCommand.Parameters["@COTA_LIBELLE"].Value = cotationIdValue;
     
                        mySqlCommand.ExecuteNonQuery();
                    }
                }


    Navré pour la longueur de ce post !
    Merci d'avance d'avoir pris de votre temps pour m'aider,

    Cordialement,

    Mathis

    • Partager sur Facebook
    • Partager sur Twitter
      14 juin 2019 à 11:42:57

      Vous vous prenez la tête pour rien, car vous utiliser cette antiquité de DataReader.

      Utilisez un DataAdapter couplé à un DataSet et votre code sera bien plus simple et bien plus maintenable.

      Votre IHM n'est pas des plus ergonomique non plus.

      Pourquoi ne pas simplement mettre 3 zones (des CheckedListBox par exemple) contenant chacune les éléments d'une catégorie dans un état précis (déjà pratiqué, à faire, no_way) et 2 * 2 boutons (entre les 3 zones) pour permettre de faire passer les éléments d'un état à un autre ?

      Comme je suppose que le passage de "déjà pratiqué" à "à faire" est un peu spécial, le bouton correspondant est peut-être inutile.

      [|zone avec la liste des "déjà pratiqué"|] > [|zone avec la liste des "à faire"|] < > [|zone avec la liste des "no_way"|]

      Pour en revenir au code métier (non IHM), l'utilisation du couple DataAdapter/DataSet permettra de synchroniser la base avec les nouvelles valeurs juste avec un seul appel :

      https://docs.microsoft.com/fr-fr/dotnet/api/system.data.common.dataadapter.update?view=netframework-4.8#System_Data_Common_DataAdapter_Update_System_Data_DataSet_

      Forcez-vous à faire les requêtes en une étape pour simplifier tout ce bordel.

      Par exemple, les "query" et "query2" peuvent être simplifier en n'utilisant que "query2" sans le "where" et de faire des "group by" coté client.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

      [C# + SQL] Requête paramétrée et UserControl

      × 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