Type de données incompatible dans l'expression du critère

joujma5 Messages postés 152 Date d'inscription samedi 11 novembre 2006 Statut Membre Dernière intervention 5 décembre 2014 - 31 juil. 2010 à 08:12
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 - 31 juil. 2010 à 15:26
bonjour,
j'ai un petit problème lors de l'insertion de données dans ma base de données access, y'a t(il quelqu'un qui peux m'aider, voici le code:
Public Sub ajouter_product()
        Dim cnx As New OleDbConnection
        cnx.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data source=C:\Users\iheb\Desktop\iheb el wa7ch\WindowsApplication1\bin\Debug\Thamer database.accdb;"

        Try
            Dim starting As Integer = 0
            Dim between As Integer = 0
            cnx.Open()
            Dim req As String "select [ProductDescription] from Products where [ProductDescription] '" & Product.TextBox1.Text & "'"
            Dim cmdd As OleDbCommand = New OleDbCommand(req, cnx)
            Dim reader As OleDbDataReader = cmdd.ExecuteReader
            If reader.Read Then
                MsgBox("This Product Name exists")
            Else
                Dim requet As String = "INSERT INTO Products([ProductDescription],[Category],[SeriaNumber],[UnitPrice],[ReorderLevel],[Discontinued],[LeadTime],[startingat],[entre]) VALUES ('" & Product.TextBox1.Text & "', '" & Product.ComboBox1.Text & "', '" & Product.TextBox3.Text & "', '" & Product.TextBox4.Text & "', '" & Product.TextBox5.Text & "', '" & Product.ComboBox2.Text & "', '" & Product.TextBox2.Text & "', '" & starting & "' , '" & between & "' )"

                Dim cmd As OleDbCommand = New OleDbCommand(requet, cnx)
                If cmd.ExecuteNonQuery() > 0 Then
                    MsgBox("Insert Succeed", MsgBoxStyle.Information)
                    Dim lv As ListViewItem = Product.ListView1.Items.Add(Product.TextBox1.Text)
                    lv.SubItems.Add(Product.TextBox3.Text)
                    lv.SubItems.Add(Product.TextBox4.Text)
                    lv.SubItems.Add(Product.TextBox2.Text)

                Else
                    MsgBox("Insert Failed", MsgBoxStyle.Information)
                End If
            End If
        Catch ex As Exception
            If cnx.State <> ConnectionState.Closed Then cnx.Close()
            MessageBox.Show("Echec :" & ex.Message, "Ajout", MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try
    End Sub

5 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
31 juil. 2010 à 11:51
Salut
Comme on te l'a <déjà montré>, découpe ta requète en ligne avec des _
Parce que là, j'ai la flemme de me retaper correctement cette requète pour voir d'où vient le problème.

Problème qui revient régulièrement sur ce forum, dont je te précaunise la lecture assidüe:

Si le champ est déclaré dans la DB de type :
- texte : mettre des ' pour encadrer sa valeur
- date : mettre des # pour encadrer sa valeur
- numérique : pas d'encadrement

Si le contenu du champ comporte des ' à l'intérieur, il faut les doubler afin qu'ils n'interfèrent pas avec la syntaxe SQL, exemple
..., 'ligne d''horizon', ...

Si le nom des champs (ou table) contient des espaces ou des caractères spéciaux comme les accents, il faut encadrer le nom de ces champs (ou tables) par des crochets [ et ]

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
31 juil. 2010 à 12:30
J'ajouterais que tu perds ton temps à faire une requête SELECT pour vérifier l'existance de ton enregistrement, il me semble qu'on te l'a suggéré aussi. Défini ta colonne comme étant unique, ainsi cela déclanchera une exception lors de la tentative d'ajout d'un doublon (que tu n'auras plus qu'à gérer via Try/Catch).

Si le contenu du champ comporte des ' à l'intérieur, il faut les doubler afin qu'ils n'interfèrent pas avec la syntaxe SQL, exemple


Je ne veux pas dire de bétises mais il me semble que les objets 'Command' (OleDbCommand, SqlCommand, OdbcCommand etc...) gèrent le doublage, mais je dis cela sans grande certitude, à tester.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
31 juil. 2010 à 13:22
@Mayzz > les objets Command s'occupent du doublage des caractères spéciaux et de la syntaxe (#, ' ou . pour les float) uniquement lorsqu'on utilise les Parameters. Exemple pour joujma5 :
Using commande As New SqlCommand("INSERT INTO maTable (champ1, champ2) " & _
                                  "VALUES (@champ1, @champ2)", connection)
    commande.Parameters.Add("@champ1", SqlDbType.Int).Value = 10
    commande.Parameters.Add("@champ2", SqlDbType.VarChar).Value = "Hello"
    Dim reader As SqlDataReader = commande.ExecuteReader()
End Using


Ce qui est très fortement conseillé afin, premièrement, d'arréter de se prendre la tête à gérer la syntaxe en fonction du type, deuxièmement, pour la lisibilité de la requête, et enfin (la plus importante), éviter les attaques par injection de code. Exemple pour les gens qui ne connaissent pas. Si vous construisez votre requete avec
sql = "SELECT * " _
    & "FROM toto "
    & "WHERE monChampText = '" & textBox1.Text & "'"

Dans votre formulaire il suffit de saisir dans textBox1 (exemple sql server)
"';DELETE FROM toto;shutdown;--"

pour que votre requete devienne :
sql = "SELECT * " _
    & "FROM toto "
    & "WHERE monChampText = '';DELETE FROM toto;shutdown;--'"

Je vous laisse imaginer le résultat et les possibilités si l'on ne gère pas les droits d'action de l'utilisateur.

Donc pour ma part je dis stop à la création de requète par concaténation lorsqu'on nous mets à disposition des outils bien meilleurs.

(désolé joujma5, ceci ne résoud pas ton problème, c'est juste pour culture perso)
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
31 juil. 2010 à 15:22
Merci beaucoup pour ces précisions foliv57.

Le mieux reste donc de passer quoi qu'il arrive par un DataSet fortement typé (celui-ci utilise les paramètres, d'ou mon incertitude plus haut).

...et enfin (la plus importante), éviter les attaques par injection de code.


Oui de même qu'en ASP.Net (mais cette sécurité vérifie le contenu des contrôles durant l'allé/retour), ce qui permet d'employer n'importe quelle méthode pour la gestion des données.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
31 juil. 2010 à 15:26
Oui de même qu'en ASP.Net (mais cette sécurité vérifie le contenu des contrôles durant l'allé/retour), ce qui permet d'employer n'importe quelle méthode pour la gestion des données.


Pardon c'est un peu confu, je parle de l'ASP.Net ce n'est pas applicable au Winform (je précise).

C'est ça de se relire en 2-2 !

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
0
Rejoignez-nous