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 :

requête sql paramétrée avec clause like et astérisque %


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2010
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2010
    Messages : 297
    Par défaut requête sql paramétrée avec clause like et astérisque %
    j'ai u Dbgrid alimenté par un Query, je veux filtrer les enregistrements affichés suivant le text saisi sur un Edit (je veux que le filtrage s'effectue au fur et à mesure de l'écriture sur le Edit). j'utilise pour ça l'évènement OnKeyPress comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TPrincipalForm.Edit1KeyPress(Sender: TObject;
      var Key: Char);
    begin
    Query.Close;
    Query.SQL.clear;
    Query.SQL.add('SELECT table1.* FROM table1 WHERE field1 like %:param1%');
    Query.Params.ParamByName('param1').AsString :=Edit1.Text;
    Query.Open;
    end;
    le problème est dans la clause like avec l'astérisque %.
    comment corriger cette erreur ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 658
    Billets dans le blog
    65
    Par défaut
    dans ce cas j'ai toujours dérogé à mes principes de paramètres et adopté la solution suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TPrincipalForm.Edit1KeyPress(Sender: TObject;
    var Key: Char);
    begin
    Query.Close;
    Query.SQL.clear;
    Query.SQL.add('SELECT table1.* FROM table1 WHERE field1 like ');
    Query.SQL.add('%'+Edit1.text+'%');
    Query.Open;
    end;
    PS : Merci d'utiliser les balises de code (bouton #)

  3. #3
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    Et en enlevant les % de la requête en les mettant dans le paramètre, tu as le même résultat (logiquement non)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Query.Params.ParamByName('param1').AsString :='%'+Edit1.Text+'%';

  4. #4
    rsc
    rsc est déconnecté
    Membre émérite
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TPrincipalForm.Edit1KeyPress(Sender: TObject;
    var Key: Char);
    begin
    Query.Close;
    Query.SQL.clear;
    Query.SQL.add('SELECT table1.* FROM table1 WHERE field1 like ');
    Query.SQL.add('%'+Edit1.text+'%');
    Query.Open;
    end;
    A vue de nez, il va manquer les "quotes" autour de la valeur chaîne, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Query.SQL.add('''%'+Edit1.text+'%''');

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query.SQL.add('SELECT table1.* FROM table1 WHERE field1 like ''%'' + :param1 +''%''');
    En principe !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut

    Ou bien encore:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT table1.* FROM table1 WHERE field1 CONTAINING :param1;
    @+

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 096
    Par défaut
    CONTAINING ou CONTAINS, ce n'est pas très standard !

    Normalement, la méthode Linkin d'inclure les % dans le paramètres est la bonne méthode !

    La Concaténation de % avec Paramètre comme le propose SQLPro peut poser des problèmes selon la DB, et cela doit nuire à la préparation (en tout cas en PHP\MySQL cela ne passe pas, je le sais c'est les rares fois où j'ai préparé un LIKE sans vraiment le vouloir à cause de ZendDB)

    En général, pour le LIKE, je suis comme SergioMaster, c'est l'exception mais j'utilise Format + des routines pour echapper les chaines pour éviter des injections SQL genre "; DROP DATABASE; #" dans Edit1.Text

    Operateur + ou CONCAT sont a tester !
    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

  8. #8
    Membre chevronné

    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2010
    Messages
    297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2010
    Messages : 297
    Par défaut merci pour vous
    je précise que j'utilise FireBird comme SGBD donc j'ai modifier l'opérateur de concaténation + par ||.
    Query.SQL.add('SELECT table1.* FROM table1 WHERE field1 like ''%'' || :param1 || ''%''');

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

Discussions similaires

  1. Requête sql problème avec un 'LIKE'
    Par Farow dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/10/2011, 09h31
  2. [MySQL] Requêtes SQL paramétrée avec un array()
    Par kamnouz dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 18/05/2011, 17h30
  3. Réponses: 3
    Dernier message: 04/06/2007, 12h29
  4. Réponses: 4
    Dernier message: 17/02/2007, 15h11
  5. Requête SQL - Pb avec la clause GROUP BY
    Par jeromesco dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 10/07/2006, 09h04

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