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

C# Discussion :

MySql requete parametrée


Sujet :

C#

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut MySql requete parametrée
    Bonjour

    Excusez moi de ne certainement pas etre le premier a poser une qustion sur les requettes parametrée en MySql

    Jusqu'ici je contournait l'obstacle considérant que la methode etait un peu fastidieuse et pas tres lisible

    Mais voila je suis tombé sur l'os !

    J'utilise depuis quelques mois une facon que je trouve simple et tres pratique

    1- je definis la commande en string a l'aide de String.Format
    2- J'appelle la methode ad hoc dans une petite classe query qui se charge de la connection et tout le reste

    Exemple :

    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
          CultureInfo ci = new CultureInfo("fr-FR");
          ci.NumberFormat.NumberDecimalSeparator = ".";
     
          string ins = "INSERT INTO Adresses (addrID,PostCode,NIS,Plaats,StraatNaam,HuisNum,Omschrijving,X,Y) "
          + "VALUES ({0},{1},{2},'{3}','{4}','{5}','{6}',{7},{8});";
          string h = string.Format(ci,ins
            , 0
            , txb_Post.Text
            , curNIS
            , txb_Plaats.Text
            , txb_Rue.Text
            , txb_Num.Text
            , txb_Desc.Text
            , X
            , Y);
          int ID = (int)qr.executeScalar(h);

    Mais voila, je viens de trouver la faille !!

    txb_Rue.Text="rue d'arsonville";
    Patatra ce foutu '\'' casse tout !!

    Donc je me dis que je dois passer par une requete parametrée
    MAIS :
    1- Sans perdre l'avantage de mon petit systeme
    2- En ne negligeant pas le CultureInfo que j'utilise pour garder les virgules dans le float !

    Je fais appel a l'equipe
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    C'est quoi cette horreur ?

    Utilise simplement une requête paramétrée tout bête, pourquoi tu t'embêtes on ton machin là ?

    1 - Je ne vois aucun avantage à ton système
    2 - Il me semble (pas sûr) que le . et la , fonctionnent tout 2 (sinon tu peux faire un replace du contenu de ta textbox).
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Horreur horreur !

    Vite dit

    1- Une requete parametrée "toute bete" comme tu dis c'est certainement trois fois plus de code a écrire !

    2- Non le point décimal ne passe pas en float MySql, il faut une virgule, et dans le cas présent la virgule ne vient pas d'un textbox mais du .Format d'un float cSharp

    3- Admettons effectivement que je fasse une requette parametrée. Je n'ai pas encore bien saisi la maniere qui me permettrait de définir la commande et les parametre avant de les passer a ma methode qui prends en charge la declaration de l'adapteur, l'ouverture de de la db et l'execution de la commande

    4- J'admet que je fais une allergie a ces commandes parametres depuis que je les ai vu la premiere fois. Mon string.format me parrait infiniment plus souple et simple (sauf dans le cas présent)
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  4. #4
    Nouveau membre du Club
    Profil pro
    Développeur D'Applications
    Inscrit en
    Décembre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Togo

    Informations professionnelles :
    Activité : Développeur D'Applications

    Informations forums :
    Inscription : Décembre 2004
    Messages : 17
    Points : 33
    Points
    33
    Par défaut
    Tu sais "Skyounet" a raison utilise les options prescrites dans ADO .Net pour l'utilisation des requêtes paramétrées. C'est aussi simple que Bonjour.
    Bon courage...

  5. #5
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    bon allez !

    Je vais faire un petit effort
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  6. #6
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    J'ai effectivement fair un GROS effort

    Ca marche mais quel horreur ce truc : j'ai l'impression de me taper des lignes d'assembleur !

    Et c'est pas tout !
    Apres avoir suivi des exemples que j'ai adapté a mes besoins, voici que le compilateur me dis que je suis obsolete

    MySql.Data.MySqlClient.MySqlParameterCollection.Add(string, object)' is obsolete:
    Add(String parameterName, Object value) has been deprecated.
    Use AddWithValue(String parameterName, Object value)'
    Allons bon !
    Voici ce que j'ai fait
    Qu'aurais-je du faire ?

    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
          MySql.Data.MySqlClient.MySqlCommand MyCmd = new MySql.Data.MySqlClient.MySqlCommand();
     
          string ins = "INSERT INTO Adresses "
                       + " (PostCode,NIS,Plaats,StraatNaam,HuisNum,Omschrijving,X,Y) "
                       + " VALUES ( "
                       + " ?PostCode,"
                       + " ?Nis,"
                       + " ?Plaats,"
                       + " ?Straat,"
                       + " ?Huis,"
                       + " ?Desc,"
                       + " X,"
                       + " ?Y";
     
          MyCmd.CommandText = ins;
          MyCmd.Parameters.Add("?PostCode", txb_Post.Text);
          MyCmd.Parameters.Add("?Nis", curNIS);
          MyCmd.Parameters.Add("?Plaats", txb_Plaats.Text);
          MyCmd.Parameters.Add("?Straat", txb_Rue.Text);
          MyCmd.Parameters.Add("?Huis", txb_Num.Text);
          MyCmd.Parameters.Add("?Desc", txb_Desc.Text);
          MyCmd.Parameters.Add("?X", X);
          MyCmd.Parameters.Add("?Y", Y);
     
     
          int ID = (int)qr.executeScalar(MyCmd);
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  7. #7
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Bah utilise AddWithValue comme il te dit...
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  8. #8
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Excuse moi Skyounet mais je suis un peu bete ce soir

    Je vois vraiment pas ce qu'il veut que je fasse

    C'est quoi un AddWithValue par rapport a ce que j'ai fait ?

    L'exemple dans la doc MySql me semble encore pire : ils font une boucle sur un array de valeurs de 0 a count !

    Super ! il faut surtout pas perdre l'ordre .....
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  9. #9
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Ca va !

    Je ne suis pas resté idiot trop longtemps : je cherchais du coté du passage des parametres !
    J'avais pas capté que simplement le nom de la méthode qui avait changé

    Tu connais la raison ?
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  10. #10
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par olibara Voir le message
    Tu connais la raison ?
    Non.

    Peut-être pour coller aux autres provider où la méthode s'appelle aussi AddWithValue (quoiqu'il me semble qu'il y a aussi une méthode Add...).

    Dans tous les cas, il vaut mieux utiliser AddWithValue.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  11. #11
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci Skyounet

    Je met résolu
    J'ai une autre question concernant le where in (..) que j'ai mis dans un nouveau sujet
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  12. #12
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par olibara Voir le message
    4- J'admet que je fais une allergie a ces commandes parametres depuis que je les ai vu la premiere fois. Mon string.format me parrait infiniment plus souple et simple (sauf dans le cas présent)
    Rassure toi, ça ne facilite pas seulement ta vie ; ça facilite aussi la vie des vilains piratins qui vont faire foirer ton système... Va vite lire ceci : http://johannblais.developpez.com/tu...acces-donnees/ (la section IV en particulier)

    Les requêtes paramétrées ont plusieurs avantages :
    -elles assurent la sécurité, en évitant l'injection SQL
    - elles évitent de s'embêter avec l'échappement de caractères spéciaux comme / ' " . ,
    - elles sont optimisées dès le deuxième appel. Avec ton code et tes string.Format, la base voit arriver une requête à chaque fois ; avec des requêtes paramétrées, la commande est toujours la même, seuls les valeurs changent, et le SGBD n'a besoin de parser la requête qu'une seule fois.

    Sinon, pourquoi ça s'appelle Add : ADO.Net se caractérise entre autres par une série d'interfaces IDbCommand, IDbConnection, IDbParameter, ... que chaque provider implémente. Dans le cas de MySQL, ils ont peut être voulu séparer les méthodes Add qui existent déjà dans l'interface IDbCommand, et celles qui n'y sont pas (comme Add(String, object) justement).
    ಠ_ಠ

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/11/2010, 11h06
  2. Requete parametrée avec CristalReport de VB6?
    Par bonsam dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 13/12/2005, 09h22
  3. [mySQL]Requete qui prend 100 % du CPU et n'aboutit pas
    Par LE NEINDRE dans le forum Requêtes
    Réponses: 20
    Dernier message: 12/10/2005, 09h36
  4. Requete parametrée TADOQuery
    Par cdlr27 dans le forum Bases de données
    Réponses: 3
    Dernier message: 01/05/2004, 18h41
  5. Réponses: 19
    Dernier message: 01/04/2004, 14h41

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