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
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 ...
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
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.
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 ...
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 ?)
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 ?
× 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.
Site Internet : https://devst.go.yj.fr
Site Internet : https://devst.go.yj.fr
Site Internet : https://devst.go.yj.fr
Site Internet : https://devst.go.yj.fr
Site Internet : https://devst.go.yj.fr
Site Internet : https://devst.go.yj.fr
Site Internet : https://devst.go.yj.fr
Site Internet : https://devst.go.yj.fr
Site Internet : https://devst.go.yj.fr
Site Internet : https://devst.go.yj.fr