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êtes paramétrées] Question très bête mais


Sujet :

Bases de données Delphi

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut [Requêtes paramétrées] Question très bête mais
    ...je ne trouve pas de réponse !

    Est-il possible d'utiliser plusieurs fois un même paramètre dans une requête paramétrée de ce genre ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    qry.SQL.Text := 'INSERT INTO Manager (Name, Area, Url) SELECT :p0, :p1, :p2 WHERE NOT EXISTS (SELECT 1 FROM Manager WHERE Name = :p0 AND Area = :p1);';
    qry.Params[0].AsString := 'blabla'; // p0
    qry.Params[1].AsInteger := Random(12); // p1
    qry.Params[2].AsString := 'www...'; // p2
    qry.ExecSQL;
    (Ici p0 et p1 sont présents deux fois dans la requête)

  2. #2
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut,

    Moi j'utilise ADO avec Access, et à ce jour je n'ai jamais pu utiliser 2 fois le même paraméters dans une seule requête, à chaque fois cela à merder.


    Par contre tu peux remplacer la notion de paramèters assez facilement avec la fonction FORMAT (%s, etc...), qui elle permet cela.

    si cela peut t'aider...


  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Autrefois j'utilisais Format mais c'est lourd dès qu'on doit boucler sur la requête, il faut re-formater la requête à chaque itération...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    qry.SQL := 'INSERT INTO MyTable (Champ1, Champ2) VALUES (:p0, :p1)';
    qry.StartTransaction;
    for i := 0 to nb do begin
     Calc(val1, val2);
     qry.Params[0].AsInteger := val1;
     qry.Params[1].AsInteger := val2;
     qry.ExecSQL;
    end;
    qry.Commit;
    et puis pour les dates par ex, c'est galère !

    Depuis quelques temps j'utilise les paramètres, jusqu'à récemment sans problème (mes requêtes sont relativement simples). Par ex. la requête que j'ai donnée avec ma question fonctionne correctement. Mais je suis tombé ces derniers jours sur un cas qui m*rdoit, c'est pour ça que je pose la question...

    En théorie, est-ce que c'est une erreur de faire comme je fais, c'est-à-dire que j'ai eu une chance énorme que ça fonctionne jusque là !? Je ne trouve aucune doc parlant de ça. Ou bien est-ce que ça révèle simplement un bug quelque part dans la gestion des paramètres ?

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Ah ah : voir ce sujet ORACLE même SQL lancé via BDE ou ODA = DataSet différent

    Le BDE permet l'utilisation multiple des paramètres car il a une bonne gestion des paramatrès (il les parcours tous par Index)
    ADO par contre, ce n'est pas le cas, il gère plutôt par nom, et du coup, il prend toujours le 1er paramètre de la liste (et oublie la seconde présence)

    Et justement lors que j'ai finalisé la migration BDE vers ADO d'une application écrite par une société tierce et traduite par un collègue démissionnaire, je me suis retrouvé avec ce bug très étrange que Buzz a du expérimenter sur les paramètres utilisés plusieurs fois en ADO

    Pour ADO, j'ai tout simplement doublé les paramètres, en changeant de nom des paramètres pour les SQL en dur et lancer manuellement !

    Mais dans certains cas, c'était des relations maitre-détail que je ne pouvais pas défaire (l'appli était conçu comme ça jusqu'à 4 niveaux d'imbrications, ouch) et il fallait que les noms paramètres\champ soient similaires pour que celui-là fonctionne (et cela ne gérait pas du tout les répétitions)
    J'ai donc fait une petite rustine pour qu'il copie les paramètres présents plusieurs fois ce qui remplace totalement la gestion du MasterSouce remplaçant la méthode TADOQuery.SetParamsFromCursor

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       DataLinkDataSource := DetailDataSet.DataSource;
       DetailDataSet.DataSource := nil;
       if DataLinkDataSource <> nil then
       begin
         DataSet := DataLinkDataSource.DataSet as TCustomADODataSet;
         if DataSet <> nil then
           for I := 0 to DetailDataSet.Parameters.Count - 1 do
             with DetailDataSet.Parameters.Items[I] do
               Assign(DataSet.FieldByName(Name));
       end;
    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

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Je n'utilise ni ADO ni BDE... Ce sont les composants ASQlite3 en fait: "The components for SQLite are quite similar to the TDatabase, TTable and TQuery components you are used to with the BDE. Only the BDE is not used now, so you don't have to deploy it."

    De plus je gère manuellement les requêtes et leurs résultats donc pas de DataSource pour moi... bon je crois que je vais doubler les paramètres là où c'est nécessaire Ca craint

  6. #6
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut
    Peut-être un début de réponse par F. Soriano dans ce thread de mai 2008 :
    Citation Envoyé par Franck SORIANO Voir le message
    Les paramètres ont été définis avec la syntaxe ":". Mais attention, si tu utilises deux fois le même nom de paramètre dans la requête, il ne comprendra pas que tu veux utiliser deux fois le même paramètre. Il créera deux paramètres différents, avec le même nom. Ce qui provoquera une erreur. De plus ensuite, le nom du paramètre est remplacé dans la requête par ?, et ADO ne fera le binding entre le paramètre et sa valeur qu'à partir de sa position dans la requête et de sa position dans Parameters.
    "Je n'ai jamais rencontré d'homme si ignorant qu'il n'eut quelque chose à m'apprendre."
    Galilée

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Ca va, j'avais moins de requêtes que je ne pensais, j'ai pu corriger assez rapidement en dédoublant. C'est quand même bizarre que ça fonctionne parfois !

    Par contre avec l'obligation de renommer les paramètres, ça complique la compréhension des requêtes après coup. Il y a intérêt à bien commenter son code ! (ce que je ne fais jamais bien sûr )

Discussions similaires

  1. question très simple mais je ne m'en souvient plus
    Par jbggg dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/11/2009, 15h04
  2. Question bête mais importante pour moi
    Par walf80 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 27/04/2007, 04h40
  3. [Tableaux] Question bête mais
    Par nazoreen dans le forum Langage
    Réponses: 2
    Dernier message: 14/06/2006, 09h06
  4. Réponses: 2
    Dernier message: 04/03/2006, 10h47
  5. Question très bête : récupérer la valeur de retour d'une fct
    Par pekka77 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 28/10/2005, 17h57

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