Partage
  • Partager sur Facebook
  • Partager sur Twitter

Structure Table Questionnaire

Sujet résolu
    17 septembre 2020 à 10:01:13

    J'ai crée la procédure stockée avec les requêtes paramétrées.  

    Par contre pour ON DUPLICATE KEY,

    J'ai une primary KEY et un indexe unique sur 3 colonnes. 

    Sur le site il y a écrit : 

    If a=1 OR b=2 matches several rows, only one row is updated. In general, you should try to avoid using an ON DUPLICATE KEY UPDATE clause on tables with multiple unique indexes.

    Je ne sais pas si je peux quand même l'utiliser dans ce cas ?  

    Sinon je fait un try catch en VB et 2 procédures stockées ? 

    BEGIN
    INSERT INTO reponse_securite(id_question, id_secteur, date, note) 
    VALUE(id_question, id_secteur, STR_TO_DATE(DateJ, '%d/%c/%Y'), reponse)
    ON DUPLICATE KEY UPDATE id_question = id_question
    WHERE id_question = id_question AND id_secteur = id_secteur AND date = STR_TO_DATE(DateJ, '%d/%c/%Y');
    END

    J'ai fait quelque chose du style mais il me donne une erreur au niveau du WHERE.  

    en VB pour les parametres j'ai juste fait comme cela : 

    Dim cmd = New MySqlCommand("ReponseQuestionnaire", con)
                cmd.CommandType = CommandType.StoredProcedure
    
                'Création et décalartion des paramètres
                With cmd.Parameters
                    .Add(New MySqlParameter("@id_question", MySqlDbType.Int16, 11)).Value = CInt(id_question)
                    .Add(New MySqlParameter("@id_secteur", MySqlDbType.Int16, 11)).Value = CInt(id_secteur)
                    .Add(New MySqlParameter("@DateJ", MySqlDbType.VarChar, 45)).Value = DateJ.Text
                    .Add(New MySqlParameter("@reponse", MySqlDbType.VarChar, 45)).Value = reponse.SelectedValue
                End With
    
                cmd.ExecuteNonQuery()
    
                con.Close()

    EDIT : Finalement j'ai simplement utilisé un IGNORE

    -
    Edité par DeveloSt 17 septembre 2020 à 10:40:17

    • Partager sur Facebook
    • Partager sur Twitter

    Site Internet : https://devst.go.yj.fr

      17 septembre 2020 à 11:47:15

      DeveloSt a écrit:

      Finalement j'ai simplement utilisé un IGNORE

      Dans ce cas, la ligne n'est pas mise à jour avec les nouvelles valeurs ...

      La syntaxe de ON DUPLICATE KEY UPDATE serait ici :

      INSERT INTO reponse_securite( id_question, id_secteur, date, note )
      VALUE( 'valeur_id_question', 'valeur_id_secteur', 'valeur_date', 'valeur_note' )
      ON DUPLICATE KEY UPDATE
      	id_question = 'valeur_id_question',
      	id_secteur = 'valeur_id_secteur',
      	date = 'valeur_date',
      	note = 'valeur_note';


      -
      Edité par Benzouye 17 septembre 2020 à 11:48:03

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        17 septembre 2020 à 12:14:36

        Je faisait un INSERT IGNORE ...; UPDATE dans la même procédure. 

         Je viens de tester avec le ON DUPLICATE KEY :

        J'ai un problème avec l'auto incrémentation qui continue même pour le update.

        De plus il ne tiens compte que du résultat de la dernière question (c'est peut être un problème au niveau de VB 

        -
        Edité par DeveloSt 17 septembre 2020 à 13:00:35

        • Partager sur Facebook
        • Partager sur Twitter

        Site Internet : https://devst.go.yj.fr

          17 septembre 2020 à 13:02:02

          DeveloSt a écrit:

          J'ai un problème avec l'auto incrémentation qui continue même pour un update

          Avec MySQL, l'auto incrément augmente pour chaque tentative d'insertion. Donc que la requête réussisse ou non (INSERT IGNORE) l'incrément augmente.

          DeveloSt a écrit:

          il ne tiens compte que du résultat de la dernière question

          Je ne sais pas ce que cela signifie, mais il faut bien faire un INSERT par question, et côté VB il faut bien changer la valeur de ta variable à chaque itération avant d'insérer ...

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            17 septembre 2020 à 13:18:53

            Je viens de tester la requete 'ON DUPLICATE KEY sans passer par des procédures et des parametres. 

            Benzouye a écrit:

            DeveloSt a écrit:

            J'ai un problème avec l'auto incrémentation qui continue même pour un update

            Avec MySQL, l'auto incrément augmente pour chaque tentative d'insertion. Donc que la requête réussisse ou non (INSERT IGNORE) l'incrément augmente.

            Le problème c'est que ça me le fait aussi avec ON DUPLICATE KEY,

            EDIT : Désolé en relisant la réponse c'est normal que ça le fait aussi :euh:

            Benzouye a écrit:

            DeveloSt a écrit:

            il ne tiens compte que du résultat de la dernière question

            Je ne sais pas ce que cela signifie, mais il faut bien faire un INSERT par question, et côté VB il faut bien changer la valeur de ta variable à chaque itération avant d'insérer ...

            La variable change bien à chaque itération, le problème vient de la procédure stockée ou des paramètres. 

            J'essaye d'utiliser les paramètres sans la procédure stockée. 



            -
            Edité par DeveloSt 17 septembre 2020 à 13:56:27

            • Partager sur Facebook
            • Partager sur Twitter

            Site Internet : https://devst.go.yj.fr

              17 septembre 2020 à 13:44:16

              DeveloSt a écrit:

              DeveloSt a écrit:

              J'ai un problème avec l'auto incrémentation qui continue même pour un update

              Avec MySQL, l'auto incrément augmente pour chaque tentative d'insertion. Donc que la requête réussisse ou non (INSERT IGNORE) l'incrément augmente.

              Le problème c'est que ça me le fait aussi avec ON DUPLICATE KEY

              Bah oui ... Il y a un INSERT INTO avant le ON DUPLICATE KEY ...

              Mais la numérotation de ta clé primaire ne devrait pas être un souci, peu importe sa valeur et si il y a des "trous" dans la numérotation ... Si cela te perturber d'afficher des trous, alors force un affichage ordonné dans ton tableau, en VB avec un compteur dans la boucle qui s'incrémente lui de un en un, mais je répète que tu n'as pas à te soucier de l'incrément de ta clé primaire ...

              Au passage je ne comprend pas pourquoi utiliser une procédure stockée dans cet exemple ...

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                17 septembre 2020 à 13:54:40

                Benzouye a écrit:

                DeveloSt a écrit:

                est-ce qu'il y a un moyen plus efficace que de mettre des INSERT INTO / UPDATE dans un for ?

                Oui ... les requêtes préparées ...

                Tu prépares une seule fois la requête, et tu l'exécutes x fois dans ta boucle ...

                C'est moi, je commence a fatiguer  o_O:lol:

                Dans mon esprit j'avais remplacé requêtes préparées par procédure stockée, je sais pas pourquoi ça me semblait logique : 

                Tu crée une requête côté serveur et si tu l'appelle plein de fois côté client je pensais que ça ferait un gain en performance. 

                EDIT : Bon tous fonctionne alors ! :) 

                Du coup je n'ai pas bien compris : 

                "Tu prépares une seule fois la requête, et tu l'exécutes x fois dans ta boucle ..." Pour l'instant j'ai ça :) 

                FOR......    
                Dim cmd As New MySqlCommand("INSERT INTO reponse_securite(id_question, id_ilot, date, note) VALUE(@id_question, @id_ilot, STR_TO_DATE(@DateJ, '%d/%c/%Y'), @reponse)" _
                                                        & "ON DUPLICATE KEY UPDATE id_question = @id_question, id_secteur = @id_secteur, date = STR_TO_DATE(@DateJ, '%d/%c/%Y'), note = @reponse", con)
                
                            With cmd.Parameters
                                .Add(New MySqlParameter("@id_question", MySqlDbType.Int32, 11)).Value = CInt(id_question)
                                .Add(New MySqlParameter("@id_secteur", MySqlDbType.Int32, 11)).Value = CInt(id_secteur)
                                .Add(New MySqlParameter("@DateJ", MySqlDbType.VarChar, 45)).Value = DateJ.Text
                                .Add(New MySqlParameter("@reponse", MySqlDbType.VarChar, 45)).Value = reponse.SelectedValue
                            End With
                
                NEXT

                -
                Edité par DeveloSt 17 septembre 2020 à 14:17:27

                • Partager sur Facebook
                • Partager sur Twitter

                Site Internet : https://devst.go.yj.fr

                  17 septembre 2020 à 16:07:03

                  La commande doit être hors de la boucle for et tu dois exécuter la requête dans la boucle ...

                  Je ne connais pas VB, mais regarde la doc :

                  https://dev.mysql.com/doc/connector-net/en/connector-net-programming-prepared-preparing.html#:~:text=To%20prepare%20a%20statement%2C%20create,dynamic%20elements%20in%20the%20query.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    17 septembre 2020 à 16:23:46

                    Oui mais dès que je sort la commande de la boucle : 

                     
                    Dim cmd As New MySqlCommand("INSERT INTO reponse_securite(id_question, id_ilot, date, note) VALUE(@id_question, @id_ilot, STR_TO_DATE(@DateJ, '%d/%c/%Y'), @reponse)" _
                                                            & "ON DUPLICATE KEY UPDATE id_question = @id_question, id_secteur = @id_secteur, date = STR_TO_DATE(@DateJ, '%d/%c/%Y'), note = @reponse", con)
                     
                    
                    FOR......  
                    
                                With cmd.Parameters
                                    .Add(New MySqlParameter("@id_question", MySqlDbType.Int32, 11)).Value = CInt(id_question)
                                    .Add(New MySqlParameter("@id_secteur", MySqlDbType.Int32, 11)).Value = CInt(id_secteur)
                                    .Add(New MySqlParameter("@DateJ", MySqlDbType.VarChar, 45)).Value = DateJ.Text
                                    .Add(New MySqlParameter("@reponse", MySqlDbType.VarChar, 45)).Value = reponse.SelectedValue
                                End With
                    con.Open() 
                    cmd.ExecuteNonQuery() 
                    con.Close() 
                    NEXT

                    ça me donne l'erreur suivante : 

                    MySql.Data.MySqlClient.MySqlException : 'Parameter '@id_question' has already been defined.'

                    EDIT : Je vais regarder de plus près le liens que tu as posté

                    -
                    Edité par DeveloSt 17 septembre 2020 à 16:27:57

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Site Internet : https://devst.go.yj.fr

                      17 septembre 2020 à 16:33:14

                      Si tu ne t'en sors pas, je te conseille de poster dans le forum VB.NET : https://openclassrooms.com/forum/categorie/langages-net

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        17 septembre 2020 à 16:43:07

                        C'est bon j'ai fait comme recommandé sur le lien que tu as posté :) 

                        Il fallait d'abord déclarer le type hors de la boucle et après assigner la valeur, ce qui fait que c'est encore plus long à écrire. :-°

                            Protected Sub EnvoyerReponse_Click(sender As Object, e As EventArgs)
                        
                                Dim cmd As New MySqlCommand("INSERT INTO reponse_securite(id_question, id_ilot, date, note) VALUE(@id_question, @id_secteur, STR_TO_DATE(@DateJ, '%d/%c/%Y'), @reponse)" _
                                                                & "ON DUPLICATE KEY UPDATE id_question = @id_question, id_secteur = @id_secteur, date = STR_TO_DATE(@DateJ, '%d/%c/%Y'), note = @reponse", con)
                        
                                With cmd.Parameters
                                    .Add(New MySqlParameter("@id_question", MySqlDbType.Int32, 11))
                                    .Add(New MySqlParameter("@id_secteur", MySqlDbType.Int32, 11))
                                    .Add(New MySqlParameter("@DateJ", MySqlDbType.VarChar, 45))
                                    .Add(New MySqlParameter("@reponse", MySqlDbType.VarChar, 45))
                                End With
                        
                                For i As Integer = 0 To DataTabQuestion.Items.Count - 1 Step 1
                                    Dim id_ilot As String = CType(DataTabQuestion.Items(i).FindControl("id_secteur"), Label).Text
                                    Dim id_question As String = CType(DataTabQuestion.Items(i).FindControl("id_question"), Label).Text
                                    Dim reponse As RadioButtonList = CType(DataTabQuestion.Items(i).FindControl("RéponseQuestion"), RadioButtonList)
                                    'MsgBox(id_question)
                                    'MsgBox(id_ilot)
                        
                                    With cmd
                                        .Parameters("@id_question").Value = CInt(id_question)
                                        .Parameters("@id_secteur").Value = CInt(id_ilot)
                                        .Parameters("@DateJ").Value = DateJ.Text
                                        .Parameters("@reponse").Value = reponse.SelectedValue
                                    End With
                        
                                    con.Open()
                                    cmd.ExecuteNonQuery()
                                    con.Close()
                        
                                Next
                        
                            End Sub

                        Sinon pour les procédure stockées tu les utilise a quelle moment ? (Pour faire des requête un peu plus longue avec des des conditions , des boucles directement avec SQL ?) 

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Site Internet : https://devst.go.yj.fr

                          17 septembre 2020 à 17:42:35

                          Les procédures stockées ne sont à utiliser que lorsque tu veux réaliser plusieurs requêtes, traitements ou calculs côté BDD.

                          Personnellement je me pose la question uniquement si besoin de curseurs (et donc de boucles), sinon je ne vois pas l'intérêt ...

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                            18 septembre 2020 à 8:28:22

                            Merci Benzouye, au travers de cette fonctionnalité supplémentaire j'ai appris plein de chose :) 

                            Je pense que cette partie de l'application est plutôt bien réalisée grâce à ton aide. 

                            J'aurai bien partagé une capture d'écran de l'interface, mais je ne suis pas sûr que j'ai le droit 

                            Il ne me manque plus qu'à développer la suite sur la même base, si jamais j'ai d'autre point bloquant ou une question je réouvre un autre sujet.  

                            -
                            Edité par DeveloSt 18 septembre 2020 à 8:35:12

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Site Internet : https://devst.go.yj.fr

                              27 octobre 2020 à 12:21:05

                              Je m'excuse de faire remonter le sujet,

                              j'ai une question supplémentaire par rapport aux structure des tables (si je reprend l'exemple suivant)

                              Benzouye a écrit:

                              DeveloSt a écrit:

                              Une Question concerne plusieurs secteur, et un secteur peut avoir plusieurs Questions

                              Je n'avais pas saisi ce point ... Du coup je comprend mieux ta question de départ ...

                              Du coup il faut reprendre :p

                              Tu as des questions, des types, des secteurs et des réponses. 4 entités = 4 tables.

                              Une question est d'un type, et un type peut concerner plusieurs questions, relation 1,n = clé étrangère dans la table question.

                              Une question est associée à plusieurs secteurs, et un secteur est associé à plusieurs questions, relation n,n = table de relation

                              Une réponse concerne une question, et une question peut avoir plusieurs réponses, relation 1,n = clé étrangère dans la table réponse.

                              Une réponse concerne un secteur, et un secteur peut avoir plusieurs réponses, relation 1,n = clé étrangère dans la table réponse.

                              Le modèle :

                              • type ( id_type [pk], libelle )
                              • secteur ( id_secteur [pk], libelle )
                              • question ( id_question [pk], id_type [fk], libelle )
                              • question_secteur ( id_question [pk][fk], id_secteur [pk][fk] )
                              • reponse ( id_reponse [pk], [id_question, id_secteur][fk], date, note ) attention fk composée sur deux colonnes vers question_secteur

                              ==> Pour ajouter une question, il me faut obligatoirement renseigner la table question_secteur.

                              Est-ce qu'il est possible de rajouter une question sans pour autant avoir un secteur ? Comment c'est géré au niveau des clés étrangères ? par exemple on veut supprimer la question de toutes les lignes mais garder les réponses que l'on avait récoltées et garder quand même la question dans la Table question (ici pour palier à se problème j'ai rajouté une colonne Afficher).  

                              Edit : Est-ce que je peux simplement enlever la foreign key de id_question dans la table question_secteur ?

                              -
                              Edité par DeveloSt 27 octobre 2020 à 15:16:40

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Site Internet : https://devst.go.yj.fr

                                2 novembre 2020 à 12:57:25

                                Par souci de facilité, je créerai un secteur nommé "Sans secteur" (ou "Tous secteur"), et j'y affecterai la question.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                  2 novembre 2020 à 15:26:16

                                  Oui, je pense que c'est plus facile de faire comme cela :) 

                                  J'ai juste un SELECT a changer (je pense) au niveau du contenu d'une liste déroulante pour qu'il ne m'affiche pas le "sans secteur". 

                                  Sinon j'ai encore un peu de mal a voir comment fonctionne les clés étrangères au niveau de l'intégrité :? 

                                  Quand j'essaye d'ajouter une question sans lieux cela ne fonctionne pas. 

                                  alors que quand j'essaye d'associer un outil sans lieux ca fonctionne.

                                  Alors que je le fait de la même manière. 

                                  EDIT : Finalement c'est moi (j'ai fait en VB : SI Secteur <> "") :euh:

                                  EDIT 2 : Pour l'intégrité avec les Clés Etrangères : 

                                  - Exemple entre les Tables type (id_type, NomType) et Question (id_question, id_type, NomQuestion) 

                                  ==> Impossible de supprimer un type si une question y est associer. 

                                  ==>  Possibilité de créer une question sans type ?

                                  ==> Possibilité de modifier le NomType

                                  ...

                                  -
                                  Edité par DeveloSt 2 novembre 2020 à 15:55:08

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Site Internet : https://devst.go.yj.fr

                                    2 novembre 2020 à 16:21:15

                                    Merci pour les liens :)
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Site Internet : https://devst.go.yj.fr

                                    Structure Table Questionnaire

                                    × 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