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

Bases de données Delphi Discussion :

"SELECT" + guillemets dans le WHERE et requestlive


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Femme Profil pro
    Inscrit en
    Avril 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 209
    Points : 93
    Points
    93
    Par défaut "SELECT" + guillemets dans le WHERE et requestlive
    Bonjour à tous.

    Je rencontre un problème très bizarre que je ne m'explique pas et qui m'embête beaucoup.

    Je l'ai reproduit sur un simple petit exemple, un bouton qui ouvre un query. Dans la clause "WHERE" du question, on fait une recherche sur une valeur STRING qui contient un guillemet.

    Voici mon code :

    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
     
    procedure TForm1.Button2Click(Sender: TObject);
     
    Var
       NomSecteur,NomSecteurBDD : AnsiString;
     
     
    begin
         NomSecteur:='Contrôle d''entrée';
         NomSecteurBDD:=StringReplace(NomSecteur,'''','''''',[rfReplaceAll, rfIgnoreCase]);
     
         Database1.Connected:=True;
     
         wwQueryUpdate.Close;
         wwQueryUpdate.SQL.Clear;
         wwQueryUpdate.DatabaseName:=DataBase1.DatabaseName;
         wwQueryUpdate.RequestLive:=False;
         wwQueryUpdate.SQL.Add('SELECT NO_ID,SECTEUR FROM SECTEURS');
         wwQueryUpdate.SQL.Add('WHERE SECTEUR = '''+NomSecteurBDD+'''');
     
         wwQueryUpdate.Prepare;
         wwQueryUpdate.Open;
     
         wwQueryUpdate.Close;
         wwQueryUpdate.SQL.Clear;
         Database1.Connected:=False;
    end;
    Le code comme ci-dessus fonctionne très bien et le résultat de la requête est juste.

    Par contre, si je change la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    wwQueryUpdate.RequestLive:=False;
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    wwQueryUpdate.RequestLive:=True;
    L'ouverture de la requête me renvoie l'erreur suivante :

    Guillemet droit manquant.
    Pour corriger ça, je dois encore une fois dédoubler les guillemets, donc rajouter la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    NomSecteurBDD:=StringReplace(NomSecteurBDD,'''','''''',[rfReplaceAll, rfIgnoreCase]);
    en 3ème position.


    Franchement je ne m'explique pas du tout ce comportement.

    Avez-vous déjà vu ça ? Avez-vous une explication?

    Merci d'avance

    Excellente journée.

    Noémie

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Ce qui m'étonne c'est qu'en RequestLive à False cela fonctionne sans le StringReplace
    Car il ne faut pas confondre le doublement de '' pour Delphi et le '' pour le SQL
    En fait '''''' c'est une chaine Delphi qui contient juste '' ce qui donne en sql un seul caractère ' !

    Le plus simple comme toujours c'est d'utiliser les paramètres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    NomSecteur:='Contrôle d''entrée'; // doublement pour compilateur Delphi !!!
     
    ...
    wwQueryUpdate.SQL.Add('SELECT NO_ID,SECTEUR FROM SECTEURS');
    wwQueryUpdate.SQL.Add('WHERE SECTEUR = :pNomSecteur');
    wwQueryUpdate.Prepare;
    wwQueryUpdate.ParamByName('pNomSecteur').AsString := NomSecteur; // magie, il fera tout seul la gestion de la chaine sans la bidouille '''''''''''''''
    wwQueryUpdate.Open;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre régulier
    Femme Profil pro
    Inscrit en
    Avril 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 209
    Points : 93
    Points
    93
    Par défaut
    Salut ShailLeTroll,

    Alors sisi, je fais bien la double conversion de la manière suivante :

    Sans requestlive :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    NomSecteur:='Contrôle d''entrée';
    NomSecteurBDD:=StringReplace(NomSecteur,'''','''''',[rfReplaceAll, rfIgnoreCase]);
    et Avec RequestLive :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    NomSecteur:='Contrôle d''entrée';
    NomSecteurBDD:=StringReplace(NomSecteur,'''','''''',[rfReplaceAll, rfIgnoreCase]);
    NomSecteurBDD:=StringReplace(NomSecteurBDD,'''','''''',[rfReplaceAll, rfIgnoreCase]);

    Je ne connaissais pas la technique des paramètres qui me semble effectivement très bien et bien plus pratique que de devoir gérer les guillemets

    Je ne sais pas pourquoi les guillemets sont gérés différemment avec ou sans requestlive mais au moins j'ai une solution qui fonctionne.

    Merci beaucoup pour ces précisions.

    Bonne journée

    Nono

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

Discussions similaires

  1. [Fonction] Quote et guillemet dans un textarea
    Par ddelec24 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/03/2007, 15h51
  2. Afficher quote/guillemet dans un input
    Par EggY14 dans le forum Langage
    Réponses: 8
    Dernier message: 15/09/2006, 12h59

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