Problème insertion du type double dans sql server
Bonjour chers tous,
je suis confronté a un problème.En effet, j'aimerai insérer des données provenant de ma table NOTER.Dans ma requête d'insertion il y a plusieurs champs déclarés de type DOUBLE et les champs qui doivent les recevoir dans SQL SERVER 2008 sont de type FLOAT. Lors de l'opération d'insertion, mon événement bouton click fonctionne quand les valeurs sont nulles mais lorsque je passe des nombre à virgules je reçois ce message d’erreur : " ERROR CONVERTING DATA TYPE VARCHAR TO FLOAT ":aie::aie:.Ainsi je comprends que ma requête INSERT n'est pas bonne. Pouvez vous m'aidez svp? je vous laisse mon code...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles BT_Insertion.Click
Dim cn As New SqlConnection("Data Source=RUFLI-PC;Initial Catalog=school;Integrated Security=True")
cn.Open()
Dim cmd As New SqlCommand("INSERT into NOTER (MATRICULE,CODE_MATIERE,CODE_SEMESTRE,NOTE_1,NOTE_2,NOTE_3,NOTE_4,MOYENNE) values('" & Lbl_matricule.Text & "','" & cmb_matiere.Text & "','" & Cmb_semestre.Text & "','" & Txb_note1.Text & "','" & txb_note2.Text & "','" & Txt_note3.Text & "','" & Txb_note4.Text & "','" & Txb_moyenne.Text & "')", cn)
Try
Dim i As Integer = cmd.ExecuteNonQuery()
MessageBox.Show(" insertion réussie", "Insertion", MessageBoxButtons.OK, MessageBoxIcon.Information)
If (i > 0) Then
cn.Close()
Else
MessageBox.Show(" Donnée non enregistrée ", "erreur !", MessageBoxButtons.OK, MessageBoxIcon.Error)
cn.Close()
End If
Catch ex As Exception
MessageBox.Show(ex.Message, " Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub |
Au fait, j'allais oublier. j'ai pratiquement le même problème pour l’insertion du DateTimePicker dans un autre FORM
Suppression du commentaire désagréable :(
il ne faut pas concaténer des valeurs dans une requete, c'est une faille de sécurité (#injectionsql) et une source de bug
il faut utiliser des requetes paramétrées
Code:
1 2 3 4
| cmd.commandtext = "insert into table (id, col1, col2) values (@id, @date, @nb)"
cmd.parameters.Add("@id", sqldbtype.int, id) ' pas sur de l'ordre des paramètres et de la syntax
cmd.parameters.Add("@date", sqldbtype.datetime, unedate)
cmd.parameters.Add("@nb", sqldbtype.double, nb) |
en concaténant une date ou un nombre vont être transformé en une représentation sous forme de string, et si la base n'a pas la même représentation attendu ca plante (ou ca inverse jour/mois par exemple)
en utilisant des paramètres, des variables typées sont créées et sont transférées sur leur représentation binaire
la représentation binaire d'une date est un format universel, alors que la représentation sous forme de string peut changer d'un pc à l'autre (donc une spécification du format string pourrait fonctionner sur ton pc mais pas sur un autre) (idem pour les nombres, le séparateur de décimal peut varier)