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

Accès aux données Discussion :

Requete SQL preparée


Sujet :

Accès aux données

  1. #1
    Membre expert
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Points : 3 654
    Points
    3 654
    Billets dans le blog
    20
    Par défaut Requete SQL preparée
    Bonjour j'ai fait une requête préparée

    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
                    conn.Open();
                    SqlCommand insert = new SqlCommand(null, conn);
                    insert.CommandText = "INSERT INTERVENANT (idIntervenant, nom, prenom, adresseInt, villeInt, codePostalInt, mail, tel, logInt, mdp)" +
                                                 "values (@id, '@nom', '@prenom', '@adresseInt', '@vilelInt', @'cp', '@mail', '@tel', '@login', '@mdp')";
     
                    insert.Parameters.AddWithValue("@id", "NEWID()");
                     insert.Parameters.AddWithValue("@nom", nom.Text);
                     insert.Parameters.AddWithValue("@prenom", prenom.Text);
                     insert.Parameters.AddWithValue("@adresseInt", adresse.Text);
                     insert.Parameters.AddWithValue("@vilelInt", ville.Text);
                     insert.Parameters.AddWithValue("@cp", cp.Text);
                     insert.Parameters.AddWithValue("@mail",mail.Text);
                     insert.Parameters.AddWithValue("@tel", telephone.Text);
                     insert.Parameters.AddWithValue("@login", login.Text);
                     insert.Parameters.AddWithValue("@mdp", mdp.Text);
     
                     insert.Prepare();
                   /* insert.CommandText = "INSERT INTERVENANT (idIntervenant, nom, prenom, adresseInt, villeInt, codePostalInt, mail, tel, login, mdp)" +
                                                "values (NEWID()," + nom.Text + "," + prenom.Text + "," + adresse.Text + "," + ville.Text + "," + cp.Text + "," +
                                                mail.Text + "," + telephone.Text + "," + login.Text + "," + mdp.Text + ")";*/
                    insert.ExecuteNonQuery();
    Il provoque cette erreur

    La méthode SqlCommand.Prepare requiert que tous les paramètres aient un type défini explicitement.

    La requête directemetn dans le SGBD fonctionne bien. Ainsi que l'envoie d'une requête non préparée. C'est dès que je la prépare qu'il me dit ça. Savez vous pourquoi ?

    Merci.
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 81
    Points : 136
    Points
    136
    Par défaut
    Il y a @'cp' au lieu de '@cp'

  3. #3
    Membre expert
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Points : 3 654
    Points
    3 654
    Billets dans le blog
    20
    Par défaut
    Ah oui bien vu merci pour la relecture, mais même comme récris ça ne marche toujours pas en fait :/ avec toujours la même erreur.
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  4. #4
    Membre expert
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Points : 3 654
    Points
    3 654
    Billets dans le blog
    20
    Par défaut
    Bon j'ai résolu en partie le problème il fallait rajouter des quote aux add (je trouve ça chelou mais bon)

    (le code qui marche du coup)
    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
    conn.Open();
                    SqlCommand insert = new SqlCommand(null, conn);
                    insert.CommandText = "INSERT INTERVENANT (idIntervenant, nom, prenom, adresseInt, villeInt, codePostalInt, mail, tel, logInt, mdp)" +
                                                 "values (NEWID(), @nom, @prenom, @adresseInt, @vilelInt, @cp, @mail, @tel, @login, @mdp)";
     
     
                    insert.Parameters.AddWithValue("@nom", "'"+nom.Text+"'");
                    insert.Parameters.AddWithValue("@prenom", "'"+prenom.Text + "'");
                    insert.Parameters.AddWithValue("@adresseInt", "'"+adresse.Text+"'");
                    insert.Parameters.AddWithValue("@vilelInt", "'"+ville.Text+"'");
                    insert.Parameters.AddWithValue("@cp", "'"+cp.Text+"'");
                    insert.Parameters.AddWithValue("@mail","'"+mail.Text+"'");
                    insert.Parameters.AddWithValue("@tel", "'"+telephone.Text+"'");
                    insert.Parameters.AddWithValue("@login", "'"+login.Text+"'");
                    insert.Parameters.AddWithValue("@mdp", "'"+mdp.Text+"'");
    Par contre maintenant j'ai une autre erreur qui est

    String or binary data would be truncated. The statement has been terminated.
    J'ai vérifier la taille des colonne elle est pourtant bonne. J'ai même excecuté la requête sans passer par la requête préparer avec les même info pour être sur et elle passe.
    Le seul champ ou je n'ai pas vraiment la main c'est pour l'id mais NEWID() ne devrai pas posé de problème de taille.

    Suggestion ?
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Regarde ici: Prepare
    Avant d'appeler Prepare, vous devez spécifier le type de données de chaque paramètre dans l'instruction à préparer. Pour chaque paramètre possédant un type de données de longueur variable, vous devez affecter la taille maximale nécessaire comme valeur de la propriété Size.

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Février 2006
    Messages : 562
    Points : 859
    Points
    859
    Par défaut
    Salut, ta requête à l'air bonne seulement une erreur que l'on fait souvent c'est d'oublier l'espace à la fin de ta première ligne avant de la tronquer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    insert.CommandText = "INSERT INTERVENANT (idIntervenant, nom, prenom, adresseInt, villeInt, codePostalInt, mail, tel, logInt, mdp) " +
                         "values (NEWID(), @nom, @prenom, @adresseInt, @vilelInt, @cp, @mail, @tel, @login, @mdp)";

  7. #7
    Membre expert
    Avatar de MarieKisSlaJoue
    Homme Profil pro
    Ingénieur Cloud
    Inscrit en
    Mai 2012
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Roumanie

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

    Informations forums :
    Inscription : Mai 2012
    Messages : 1 145
    Points : 3 654
    Points
    3 654
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    Regarde ici: Prepare
    Avant d'appeler Prepare, vous devez spécifier le type de données de chaque paramètre dans l'instruction à préparer. Pour chaque paramètre possédant un type de données de longueur variable, vous devez affecter la taille maximale nécessaire comme valeur de la propriété Size.

    Alors j'ai fait comme dans l'exemple, du coup je passe de ça en requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //Insertion du nouveau intervenant
                            /*cmdInsert = new SqlCommand("INSERT INTERVENANT (idIntervenant, nom, prenom, adresseInt, villeInt, codePostalInt, mail, tel, logInt, mdp )" +
                                                       "values (NEWID(),'" + nom.Text + "','" + prenom.Text + "','" + adresse.Text + "','" + ville.Text + "','" + cp.Text + "','" +
                                                       mail.Text + "','" + telephone.Text + "','" + login.Text + "','" + mdp.Text.GetHashCode() + "')", conn);*/
    à ça

    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
    SqlCommand insert = new SqlCommand(null, conn);
                            insert.CommandText = "INSERT INTERVENANT (idIntervenant, nom, prenom, adresseInt, villeInt, codePostalInt, mail, tel, logInt, mdp) " +
                                                 "values (NEWID(), @nom, @prenom, @adresseInt, @villeInt, @cp, @mail, @tel, @login, @mdp)";
     
                            SqlParameter nom = new SqlParameter("@nom",SqlDbType.Text , 20);
                            nom.Value = this.nom.Text;
                            SqlParameter prenom = new SqlParameter("@prenom", SqlDbType.Text, 20);
                            prenom.Value = this.prenom.Text;
                            SqlParameter adresseInt = new SqlParameter("@adresseInt", SqlDbType.Text, 60);
                            adresseInt.Value = this.adresse.Text;
                            SqlParameter villeInt = new SqlParameter("@villeInt", SqlDbType.Text, 25);
                            villeInt.Value = this.ville.Text;
                            SqlParameter cp = new SqlParameter("@cp", SqlDbType.Text, 5);
                            cp.Value = this.cp.Text;
                            SqlParameter mail = new SqlParameter("@mail", SqlDbType.Text, 50);
                            mail.Value = this.mail.Text;
                            SqlParameter tel = new SqlParameter("@tel", SqlDbType.Text, 10);
                            tel.Value = this.telephone.Text;
                            SqlParameter login = new SqlParameter("@login", SqlDbType.Text, 20);
                            login.Value = this.login.Text;
                            SqlParameter mdp = new SqlParameter("@mdp", SqlDbType.Int, 100);
                            mdp.Value = this.mdp.Text.GetHashCode();
                            insert.Parameters.Add(nom);
                            insert.Parameters.Add(prenom);
                            insert.Parameters.Add(adresseInt);
                            insert.Parameters.Add(villeInt);
                            insert.Parameters.Add(cp);
                            insert.Parameters.Add(mail);
                            insert.Parameters.Add(tel);
                            insert.Parameters.Add(login);
                            insert.Parameters.Add(mdp);
                            insert.ExecuteNonQuery();
    Alors ça marche très bien, même avec les caractère spéciaux donc c'est super. Mais y'a pas une façon simplifié de ce que j'ai fait ? Parce que quand j'ai montré ça à mon collègue il à badé...

    Merci en tout cas.
    Ce post à été écrit par un panda
    Apollo 11 - AGC revue de code
    -- qwerty keybord

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Non il semble que tu dois spécifier à chaque fois le type de paramètre pour une requête préparée.

  9. #9
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Collez votre requète dans une procédure stockée ne vous prenez pas la tête!

    En plus d'être plus performant c'est aussi plus maintenable: si vous avez un bug sur votre requète, pas besoin de relivrer l'application, une modification de la procédure stockée suffit.
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

Discussions similaires

  1. [PDO] Preparation requete SQL avec 2 param
    Par Général03 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/06/2009, 09h18
  2. Problème Requete SQL et QuickReport
    Par arnaud_verlaine dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/01/2004, 09h31
  3. requete sql
    Par autumn319 dans le forum ASP
    Réponses: 22
    Dernier message: 10/09/2003, 16h46
  4. Paramètre requete SQL (ADOQuery)
    Par GaL dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/07/2002, 11h24
  5. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 13h43

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