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

 Delphi Discussion :

ADO parambyname parametre introuvable


Sujet :

Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Points : 133
    Points
    133
    Par défaut ADO parambyname parametre introuvable
    bonjour,

    j'ai une petit problème sur un remplacement de paramètre dans une requête
    la fonction suivante fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    With Tadoquery.Create(nil) do
      begin
        ConnectionString := Connection_string;
        SQL.text := 'UPDATE clients '+
                          'SET [warning message]=[warning message] + ''toto'' +
                          'WHERE idnumber = :clientid';
        try
          Parameters.ParamByName('clientid').DataType := ftInteger;
          Parameters.ParamByName('clientid').value := clientid;
          ExecSQL;
        except on E:Exception do
            showmessage(E.Message);
        end;
    par contre la fonction suivante en mettant 'toto' en paramètre, il arrive pas a remplacer ce paramètre (je crois que j'avais déjà eu ce problème quand le paramètre était pas dans le where ...)
    j'ai besoin de passer par un paramètre car parfois j'ai une cote ' dans le message et du coup, la requête plante ...

    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
     
    With Tadoquery.Create(nil) do
      begin
        ConnectionString := Connection_string;
        SQL.text := 'UPDATE clients '+
                          'SET [warning message]=[warning message] + '':mon_texte'' +
                          ' WHERE idnumber = :clientid';
        try
          Parameters.ParamByName('clientid').DataType := ftInteger;
          Parameters.ParamByName('clientid').value := clientid;
          Parameters.ParamByName('mon_texte').DataType := ftstring;
          Parameters.ParamByName('mon_texte').value := 'toto';
          ExecSQL;
        except on E:Exception do
            showmessage(E.Message);
        end;
    comment feriez vous ??
    merci

    greg

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 742
    Points : 5 432
    Points
    5 432
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'UPDATE clients '+
        'SET [warning message]=[warning message] +:mon_texte' +
        ' WHERE idnumber = :clientid';

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Points : 133
    Points
    133
    Par défaut
    merci de ta rapide réponse.

    en fait la requête est beaucoup plus longue donc je l'ai simplifié pour voir ou je merdouille donc avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      SQL.text := 'UPDATE clients '+
                    'SET [warning message]=[warning message]+'+
                   ':mon_texte'+
                    'WHERE  idnumber = 222';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      SQL.text := 'UPDATE clients '+
                    'SET [warning message]=[warning message]+'+
                    ':mon_texte+''  {\PTS}'' '+
                    'WHERE  idnumber = 222';
    la première requête marche, pas la seconde si j'ajoute {\PTS} a mon texte...
    par contre si je mets le ' {\PTS} ' dans le paramètre, Parameters.ParamByName('mon_texte').value := 'toto'+'{\PTS}' ; ça marche

    j'ai fait un showmessage de sql.text pour voir si j'avais pas une ' en trop
    j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE clients SET [warning message]=[warning message]+:mon_texte+'  {\PTS}' WHERE  idnumber = 222
    j’exécute la requête en replaçant :mon_texte par 'mon_texte' , la requête fonctionne bien dans un requeteur...

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 163
    Points : 41 346
    Points
    41 346
    Billets dans le blog
    63
    Par défaut
    Bonjour,

    je n'aime pas trop ADO, mais le \P ne serait-il pas traité comme un caractère d'échappement dans la préparation de la requête par ADO ?
    Que se passe-t'il avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL.text := 'UPDATE clients '+
                    'SET [warning message]=[warning message]+'+
                    ':mon_texte+''  {PTS}'' '+
                    'WHERE  idnumber = 222';
    cette première formulation indiquerait bien qu'il s'agit d'un problème de caractère d'échappement
    ou avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL.text := 'UPDATE clients '+
                    'SET [warning message]=[warning message]+'+
                    ':mon_texte+''  {\\PTS}'' '+
                    'WHERE  idnumber = 222';
    celle formulation devrait le contourner

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Points : 133
    Points
    133
    Par défaut
    je viens d'essayer avec juste PTS au lieu {\PTS} , ça marche pas...
    comme si le paramètre devait être en dernière position...bizarre

    j'ai voulu tester FireDAC mais avec mon delphi berlin professional, y'a pas l'air d'y avoir les drivers pour mssql..

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 163
    Points : 41 346
    Points
    41 346
    Billets dans le blog
    63
    Par défaut
    Mais la concaténation en SQL ce n'est pas + c'est || je n'y avais pas fait attention !
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE clients SET [warning message]=[warning message]||:montexte||' {\PTS}' WHERE idnumber = 222';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL.Text:='Update clients set [warning message]=[warning message]||:montexte||'+Quotedstr(' {\PTS}')+'WHERE idnumber=222';

  7. #7
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 742
    Points : 5 432
    Points
    5 432
    Par défaut
    Question bête mais pourquoi vouloir absolument mettre ce '{\PTS}' dans la requête alors qu'apparemment tu cherches simplement à l'ajouter derrière le paramètre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Parameters.ParamByName('mon_texte').value := 'toto {\PTS}';

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par popo Voir le message
    Question bête mais pourquoi vouloir absolument mettre ce '{\PTS}' dans la requête alors qu'apparemment tu cherches simplement à l'ajouter derrière le paramètre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Parameters.ParamByName('mon_texte').value := 'toto {\PTS}';

    désolé, j'étais en vacances

    en fait , dans la table, il y a un champ mémo ou les gens tapent se qu'ils veulent et moi je veux ajouter une info que j'entoure de balises, par exemple '{PTS} toto a eu 10 points {\PTS}' , pour pouvoir effacer ultérieurement uniquement mes ajouts

  9. #9
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 163
    Points : 41 346
    Points
    41 346
    Billets dans le blog
    63
    Par défaut
    Bonjour,

    ça peut friser l'injection de SQL ce truc ! Il y a vraiment intérêt à passer par les paramètres

  10. #10
    Membre actif Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Mars 2019
    Messages : 215
    Points : 225
    Points
    225
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Mais la concaténation en SQL ce n'est pas + c'est || je n'y avais pas fait attention !
    Cela dépends des bases de données. Avec SQL Server, par exemple, c'est bien un +.

  11. #11
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 163
    Points : 41 346
    Points
    41 346
    Billets dans le blog
    63
    Par défaut
    Et moi qui croyait MS SQL ANSI compliant
    cela dit il y a aussi la fonction CONCAT
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE clients SET [warning message]=CONCAT([warning message],:montexte,' {\PTS}') WHERE idnumber = 222';

  12. #12
    Membre actif Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

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

    Informations forums :
    Inscription : Mars 2019
    Messages : 215
    Points : 225
    Points
    225
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    cela dit il y a aussi la fonction CONCAT
    Elle n'est dispo qu'à partir de SQL Server 2012.
    J'ai encore des clients en 2008...

Discussions similaires

  1. [AC-2016] parametre introuvable à l'ouverture d'un état
    Par PipoWIL dans le forum IHM
    Réponses: 1
    Dernier message: 03/01/2018, 12h26
  2. classe ado requête parametrée
    Par jadey dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 08/05/2007, 23h32
  3. [ADO] Parambyname et champ nul
    Par okparanoid dans le forum Bases de données
    Réponses: 2
    Dernier message: 13/11/2006, 12h31
  4. [ADO][MySQL]probleme de parametres
    Par bidochon dans le forum Bases de données
    Réponses: 6
    Dernier message: 11/06/2004, 20h33
  5. [VB6] [ADO] Procedure stockée : spécifier les paramètres
    Par adepdoom dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 16/10/2002, 10h45

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