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 :

Logguer les requêtes SQL


Sujet :

Bases de données Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Logguer les requêtes SQL
    Bonjour,

    N'ayant rien trouvé dans la FAQ, ni dans la recherche sur le forum, je me tourne vers vous.

    Je développe un programme de synchronisation de 2 bases de données, l'une est MySQL et l'autre Sage. Je souhaite mettre en place un log des requêtes, mais j'ai un soucis. En effet dans mon log je recupère les requêtes avec les paramètres alors que j'aimerai récupérer la requête effective.

    Par exemple si j'ai la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    query.SQL.Clear;
    query.SQL.Add( 'SELECT * FROM USERS WHERE id = :id' );
    query.ParamByName('id').AsString := 'titi';
    query.open;
    log( query.SQL.Text );
    J'aimerai obtenir dans mon fichier de log la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM USERS WHERE id = 'titi'
    Hors je récupère le texte que j'ai renseigné, à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM USERS WHERE id = :id
    J'ai essayé de mettre Params[0] à la place de ParamByName, mais cela ne change rien, idem si je fait un query.prepare avant l'execution.

    Quelqu'un aurait il une solution à ce problème ?

    Merci d'avance.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Je ne pense pas que tu puisses récupérer la requête comme tu le désires.

    Puisque tu connais la valeur de ton paramètre je te conseille de passer directement ton paramètre à la requête SQL de la façon suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function queryFormat(TextSQL, param: string):string;
    begin
      Result := TextSQL + ' ' + quotedStr(param);
    end;
     
    ...
    baseQuery := 'SELECT * FROM USERS WHERE id =';
     
    query.SQL.Clear;
    query.SQL.Add( baseQuery + ' :id' );
    query.ParamByName('id').AsString := 'titi';
    query.open;
    log( queryFormat(baseQuery,query.ParamByName('id').AsString));
    Cordialement
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Merci pour la réponse et une solution possible.

    Je vais voir comment l'implémenter sans trop de problème car j'ai des requêtes avec une 10aines de paramètres donc j'aimerais éviter d'avoir des lignes à rallonge, mais la solution me semble pertinente, à moi de l'adapter.

    Cordialement.

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Pour manipuler deux nombreux paramètres je te conseille de bricoler une routine de ce type qui utilise les tableaux de variants à une dimension te permettant ainsi de construire ta clause where peu importe le nombre de paramètres.

    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
     
    function makeWhere( lField, lValue: variant):string;
    var I: integer;
    begin
      if not VarIsArray(lField) or not VarIsArray(lValue)
         or (VarArrayHighBound(lField,1) <> VarArrayHighBound(lValue,1))
        then exit;
      Result := 'Where ';
      for I := VarArrayLowBound(lField,1) to VarArrayHighBound(lField,1) do
      begin
        Result := Result + varToStr(VarArrayGet(lField,[i])) + '='
                         + quotedStr(varToStr(VarArrayGet(lValue,[i])));
        if (I >= VarArrayLowBound(lField,1)) and (I < VarArrayHighBound(lField,1))
          then Result := Result + ' AND '
          else Result := Result + ' ';
      end;
    end;
    Utilisation avec par exemple trois paramètres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    makeWhere(
       varArrayOf(['champ1','champ2','champ3']),
       varArrayOf(['valeur1','valeur2','valeur3']));
    Ceci n'est qu'un simple exemple très limité car la clause Where ne se construit que pour des paramètres de type string et de plus seul le AND n'est traitée. A toi la main maintenant

    Cordialement
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

Discussions similaires

  1. [SQL] Sprintf ou concaténation pour créer les requêtes SQL?
    Par EvilAngel dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 15/09/2006, 17h08
  2. Capter les requêtes SQL
    Par ced62 dans le forum Oracle
    Réponses: 12
    Dernier message: 28/06/2006, 17h32
  3. [D5][BDE][Multibase] Récupérer les requêtes SQL d'une TTable
    Par Escandil dans le forum Bases de données
    Réponses: 3
    Dernier message: 11/01/2006, 14h29
  4. [iBatis] Logger les requètes SQL
    Par bslota dans le forum Persistance des données
    Réponses: 2
    Dernier message: 25/11/2005, 14h29
  5. tracer les requêtes SQL
    Par izioto dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 13/10/2005, 16h35

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