IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Utilisation difficile de .executeNonQuery


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Août 2011
    Messages : 103
    Par défaut Utilisation difficile de .executeNonQuery
    Bonjour
    J'ai une erreur quand je génère mon code au niveau de l'éxécution de la requete mais je ne vois pas trop ! Cela me met une erreur de syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    Dim con As New OleDb.OleDbConnection
     
        Public Sub insertUSER(ByVal username As String, ByVal mdp As String, ByVal quest As String, ByVal rep As String)
            'vérif des passages de paramètres
            MessageBox.Show(username & mdp & quest & rep)
            'chaine de connection
            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & createChemin()
            'chaine des paramètres
            Dim valeur As String = username + "," + mdp + "," + quest + "," + rep
            MessageBox.Show(valeur)
            'message d'info
            MessageBox.Show("Connection à la base : OK", ".:: Connection", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Dim insert As OleDb.OleDbCommand
            Dim sql_ajouter As String
            sql_ajouter = "INSERT INTO USERS(login,password,question,reponse) VALUES(" + valeur + ")"
            Dim requete As String = sql_ajouter
            MessageBox.Show(requete)
            insert = New OleDb.OleDbCommand(sql_ajouter, con)
            'ouverture connection
            con.Open()
            insert.ExecuteNonQuery()
            con.Close()
        End Sub
    Merci.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Bonjour,

    1) Utiliser des requêtes paramétrées pour éviter injections SQL, pour améliorer la performance, et pour éviter ce genre d'erreur

    2) Ton erreur vient du fait que tu n'insères pas les quotes :

    Tu te trouves donc avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO USERS(login,password,question,reponse) VALUES(username, mdp, quest, rep)
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO USERS(login,password,question,reponse) VALUES('username', 'mdp', 'quest', 'rep')
    Toutefois évites de corriger en ajoutant simplement les quotes dans la concaténation, privilégies les requêtes paramétrées.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Août 2011
    Messages : 103
    Par défaut
    J'ai fait comme vous me l'aviez conseillé de passer des paramètre mais cela m'affiche une erreur de syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Public Sub insertUSER()
            'chaine de connection
            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & createChemin()
            'message d'info
            MessageBox.Show("Connection à la base : OK", ".:: Connection", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Dim insert As OleDb.OleDbCommand
            Dim sql_ajouter As String
            sql_ajouter = "INSERT INTO USERS(login,password,question,reponse) VALUES(username, mdp,quest, rep)"
            insert = New OleDb.OleDbCommand(sql_ajouter, con)
            insert.Parameters.AddWithValue("username", inscription.TBlogin.Text)
            insert.Parameters.AddWithValue("mdp", inscription.TBmdp.Text)
            insert.Parameters.AddWithValue("quest", inscription.CBquest.Text)
            insert.Parameters.AddWithValue("rep", inscription.TBrep.Text)
            'ouverture connection
            insert.Connection.Open()
            insert.ExecuteReader() 'ERREUR DE SYNTAXE DANS l'instruction insert into
            insert.Connection.Close()
        End Sub

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par thomasaurelien Voir le message
    J'ai fait comme vous me l'aviez conseillé de passer des paramètre mais cela m'affiche une erreur de syntaxe
    Remplacer par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sql_ajouter = "INSERT INTO USERS(login,password,question,reponse) VALUES(username, mdp,quest, rep)"
    Par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sql_ajouter = "INSERT INTO USERS(login,password,question,reponse) VALUES(@username, @mdp,@quest, @rep)"
    Il faut lui indiquer que username, mdp,quest, rep sont des paramètres. Le '@' est là pour ça.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Août 2011
    Messages : 103
    Par défaut prob requete access
    toujour le même prob même en mettant le @

    Erreur de syntaxe dans l'instruction INSERT INTO.

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Bonjour,

    pouvez-vous essayer en remplaçant les 4 valeurs pas des "?"
    Je n'utilise pas OLEDB mais selon les providers les paramètres ne sont pas déclarés/utilisés pareil.
    En utilisant des "?" les paramètres doivent du coup êtres déclarés dans le bon ordre.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sql_ajouter = "INSERT INTO USERS(login,password,question,reponse) VALUES(?, ?, ?, ?)"

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Août 2011
    Messages : 103
    Par défaut toujour le même probleme
    Sa commence à me prendre la tête cela fait 2jours que j'essaye d'insérer des données dans ma base. Cela ne marche toujours pas .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    Dim con As New OleDb.OleDbConnection
     
        Public Sub insertUSER()
            'chaine de connection
            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & createChemin()
            'message d'info
            MessageBox.Show("Connection à la base : OK", ".:: Connection", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Dim insert As OleDb.OleDbCommand
            Dim sql_ajouter As String
            sql_ajouter = "INSERT INTO USERS(login,password,question,reponse) VALUES(?, ?,?, ?)"
            insert = New OleDb.OleDbCommand(sql_ajouter, con)
            insert.Parameters.AddWithValue("@login", inscription.TBlogin.Text)
            insert.Parameters.AddWithValue("@password", inscription.TBmdp.Text)
            insert.Parameters.AddWithValue("@question", inscription.CBquest.Text)
            insert.Parameters.AddWithValue("@reponse", inscription.TBrep.Text)
            'ouverture connection
            insert.Connection.Open()
            insert.ExecuteReader() 'ERREUR DE SYNTAXE DANS l'instruction insert into
            insert.Connection.Close()
        End Sub
     
     
        Public Sub createBase()
            Dim tblu As New ADOX.Table()
            Dim keyu As New ADOX.Key()
            'déclaration BASE
            Dim db As New ADOX.Catalog
            'création BASE
            db.Create("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & createChemin())
            tblu.Name = "USERS"
            tblu.Columns.Append("login", ADOX.DataTypeEnum.adWChar, 15)
            tblu.Columns.Append("password", ADOX.DataTypeEnum.adWChar, 8)
            tblu.Columns.Append("question", ADOX.DataTypeEnum.adWChar, 30)
            tblu.Columns.Append("reponse", ADOX.DataTypeEnum.adWChar, 10)
            db.Tables.Append(tblu)
            keyu.Name = "cleprimaireu"
            keyu.Type = ADOX.KeyTypeEnum.adKeyPrimary
            keyu.RelatedTable = "USERS"
            keyu.Columns.Append("login")
            tblu.Keys.Append(keyu)
     
        End Sub
    Voici le code d'insertion et le code de création de la table

  8. #8
    Membre émérite Avatar de bizet
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2005
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 717
    Par défaut
    Salut

    une fois que l'on te donne une solution fais une petite recherche sur le net et tu trouveras toutes tes reponses :

    FAQ DVP

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Août 2011
    Messages : 103
    Par défaut reponse
    Franchement je fais que cela j'ai recherché sur internet mais aucun exemple ne coorespond au mien avec les " ou les ' je m'embrouille un peu

  10. #10
    Membre émérite Avatar de bizet
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2005
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 717
    Par défaut
    Tu n'as pas a te soucier des " ou '

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    sql_ajouter = "INSERT INTO USERS(login,password,question,reponse) VALUES(@login, @password,@question, @reponse)"
            insert = New OleDb.OleDbCommand(sql_ajouter, con)
            insert.Parameters.AddWithValue("@login", inscription.TBlogin.Text)
            insert.Parameters.AddWithValue("@password", inscription.TBmdp.Text)
            insert.Parameters.AddWithValue("@question", inscription.CBquest.Text)
            insert.Parameters.AddWithValue("@reponse", inscription.TBrep.Text)
    Si ca ne fonctionne pas comme ca, remplace @ par ?
    par exemple @login devient ?login

  11. #11
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    En fin de compte les requêtes paramétrées permettent au SGBD de s'occuper lui même de reconnaitre le type du paramètre attendu.
    Donc s'il attend un String, il se chargera de mettre les quotes nécessaires.
    Si c'est une date, tu n'auras pas besoin de te soucier de savoir si elle est au format français, anglais, si tu dois utiliser des #, des quotes, etc.

    Je sais que ça peut être agaçant ces différences liées à la syntaxe, mais crois moi tu seras gagnant à prendre l'habitude d'utiliser des requêtes paramétrées, quand tu es en charge de reprendre un projet pas mal buggé à cause d'erreur liées aux concaténations, tu perds au moins le double de temps à tout corriger.

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Août 2011
    Messages : 103
    Par défaut
    En faite je passe pas une fonction qui forme ma chaine de caractère INSERT INTO mais cela me met toujours une erreur au niveau de la syntaxe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
        Public Function insertUSER(ByVal username As String, ByVal mdp As String, ByVal quest As String, ByVal rep As String) As String
            Return "Insert into USERS " & "(login, password, question, reponse) " & "values ('" & username & "','" & mdp & "','" & quest & "','" & rep & "')"
        End Function
     
      Public Sub InsertRow(ByVal insertSQL As String)
            MessageBox.Show(insertSQL)
            Dim con As ADODB.Connection
            Dim rs As ADODB.Recordset
     
            con = New ADODB.Connection
            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & createChemin()
            con.Open()
            rs = con.Execute(insertSQL)
            rs.Fields.Refresh()
            rs = Nothing
            con.Close()
            con = Nothing
        End Sub
    En faite, j'ai carement tous changé entre ce code là et le 1er que j'ai posté car dans tous les cas il y avait une erreur de syntaxe donc j'ai tous changé mais il y a tjrs cette erreur mais je pense de plus en plus que l'erreur ne vien pas de l'insertion mais plutot de la connection ou autre .

  13. #13
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Août 2011
    Messages : 103
    Par défaut parametre requete sql
    finallement j'ai écouté ton conseil des requetes avec paramètre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Dim con As New OleDb.OleDbConnection
     
        Public Sub insertUser()
            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & createChemin()
            Dim cmd As OleDb.OleDbCommand
            Dim sqlinsert As String
     
            sqlinsert = "INSERT INTO USERS (login, password, question, reponse) VALUES (@vlogin, @vpassword, @vquestion, @vreponse)"
            cmd = New OleDb.OleDbCommand(sqlinsert, con)
            cmd.Parameters.AddWithValue("vlogin", inscription.TBlogin.Text)
            cmd.Parameters.AddWithValue("vpassword", inscription.TBmdp.Text)
            cmd.Parameters.AddWithValue("vquestion", inscription.CBquest.Text)
            cmd.Parameters.AddWithValue("vreponse", inscription.TBrep.Text)
            MessageBox.Show(sqlinsert)
            cmd.Connection.Open()
            cmd.ExecuteReader()
            cmd.Connection.Close()
        End Sub

  14. #14
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Et du coup ça fonctionne comme ça ?
    Je ne vois pas vraiment d'ou pouvait venir ton problème si ça fonctionne maintenant
    Quoi qu'il en soit tu auras des requêtes paramétrées c'est donc positif
    Sinon tu dois pouvoir faire executenonquery plutôt que executereader, ça te retournera un entier qui te donne le nombre de ligne affectées, après soit tu l'utilise, soit non.

  15. #15
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Août 2011
    Messages : 103
    Par défaut erreur syntaxe
    Nan justement, j'ai écouté les conseils mais sa ne marche toujours pas ! Mais que j'utilise n'importe quel méthode c'est toujours la même erreur.

  16. #16
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    As-tu essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            sql_ajouter = "INSERT INTO USERS(login,password,question,reponse) VALUES(?login, ?password,?question, ?reponse)"
            insert = New OleDb.OleDbCommand(sql_ajouter, con)
            insert.Parameters.AddWithValue("?login", inscription.TBlogin.Text)
            insert.Parameters.AddWithValue("?password", inscription.TBmdp.Text)
            insert.Parameters.AddWithValue("?question", inscription.CBquest.Text)
            insert.Parameters.AddWithValue("?reponse", inscription.TBrep.Text)

  17. #17
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    La seule question ici : quelle est la syntaxe de nommage des paramètres avec le moteur ACE ?

  18. #18
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Août 2011
    Messages : 103
    Par défaut Insertion tables
    Merci à tous pour votre aide. Finalement j'y suis arrivé en reprenant tous depuis le début.
    Je sais pas si c'est la meilleur méthode mais sa marche.
    Voici le code si quelqu'un à bessoin d'aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
        Public Function insert_user(ByVal login As String, ByVal mdp As String, ByVal question As String, ByVal rep As String) As Boolean
     
            connection()
            Try
                'Indiquer le type de commande
                Cmd.CommandType = CommandType.Text
                Cmd.CommandText = "INSERT INTO USERS (LOGIN, MDP, QUESTION, REPONSE) VALUES ('" & login & "','" & mdp & "','" & question & "','" & rep & "')"
                'on exécute la commande
                Cmd.ExecuteNonQuery()
                'Fermer la connexion
                Cnx.Close()
                Return True
            Catch ex As Exception
                MsgBox("Erreur dans l'insertion de d'un USERS" & vbCrLf & ex.Message, , "Erreur")
                Return False
            End Try
     
        End Function

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ode15i utilisation difficile?
    Par membreComplexe12 dans le forum MATLAB
    Réponses: 0
    Dernier message: 09/01/2013, 01h21
  2. [VB.Net] Utilisation de ExecuteNonQuery()
    Par AcidX dans le forum Windows Forms
    Réponses: 3
    Dernier message: 16/05/2009, 17h08
  3. Réponses: 11
    Dernier message: 19/02/2009, 15h49
  4. [Oracle8i] Utilisation d'index difficile à comprendre
    Par Drizzt [Drone38] dans le forum SQL
    Réponses: 2
    Dernier message: 03/03/2008, 16h59
  5. Récuperation id difficile pour utilisation css
    Par lynchmaniac dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/02/2006, 18h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo