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

C++Builder Discussion :

Quelqu'un a-t-il déjà penser à wrapper les TSQLQuery ?


Sujet :

C++Builder

  1. #1
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut Quelqu'un a-t-il déjà penser à wrapper les TSQLQuery ?
    Quelqu'un s'est-il déjà amusé à wrapper les TSQLQuery afin de rendre leur utilisation moins lourde au niveau de la syntaxe ?

    Je suis entrain d'écrire une classe qui est composée d'un TSQLQuery et qui permettra la syntaxe suivante.

    Voici un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ulint findFirstnameOfUser( ulint userID ) {
       SqlQuery query( connector, 
           "SELECT FIRSTNAME FROM USER WHERE ID = :ID ");
       return query("ID", userID).activate()["FIRSTNAME"];
    }
    En gros, je vais modifier ma classe pour permettre d'écrire quelque chose de plus simple, et dans le cas où la query ne retournerait aucun résultat, avoir alors une valeur par défaut.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SqlQuery query( connector, 
       "SELECT 1 FROM USER WHERE EXISTS ( .... )" );
    return ( query("ID", userID)() | 0 );
    l'opérateur "()" aurait été surchargé pour appeler le Active du TSQLQuery,

    dans le cas où le resultat serait vide, on retourne 0 via l'opérateur "|".


    Qu'en pensez-vous ???

    Avez-vous eu des idées similaires ?

    Merci

  2. #2
    Membre habitué
    Inscrit en
    Mars 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 14
    Par défaut
    Citation Envoyé par swirtel Voir le message
    Avez-vous eu des idées similaires ?
    oui

  3. #3
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    Je pensais que des personnes auraient cherché à améliorer le TSQLQuery ou qui l'utilisent, mais j'ai l'impression d'être le seul.

  4. #4
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    Un bête exemple d'utilisation que j'utilise maintenant au quotidien, pour me simplifier l'écriture.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef unsigned long int ulint;
     
    ulint id_user = 200;
     
    SqlConnector sqlConnector; //< Contient les infos pour se connecter
    SqlQuery query( sqlConnector, "SELECT * FROM USER WHERE ID = :ID" );
    query["ID"] = id_user;
    query.activate();
    par après, j'ai surchargé l'opérateur () pour qu'il prennent deux arguments ou aucuns,

    pour l'opérateur () vide , Activation de la query
    pour l'opérateur () surchargé de deux arguments

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    template< typename T > operator() ( std::string const & field, T const &  value ) {
      // Assignation vers le bon type, soit AsString, AsInteger, etc...
    }
    un exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SqlQuery query( sqlConnector, "SELECT * FROM USER WHERE ID = :ID" );
    query( "ID", id_user )();

    Autre chose, j'ai modifié aussi ma classe pour que lorsque la query ne trouve pas une valeur, elle puisse retourner une valeur par défaut.

    Ce qui donne cet exemple-ci

    Désolé, je n'ai pas trouvé un exemple qui pourrait être généralisé pour d'autre bout de code, mais dans le code que je maintiens, cela m'aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SqlQuery query( sqlConnector, "SELECT XXX FROM USER WHERE ID = :ID" );
    return ( query( "ID", id_user()()["XXX"] | "Inconnu" );
    Donc, dans le cas ou la query ne trouverait pas l'utilisateur via son ID, le code retournera "Inconnu".



    En gros, j'ai réalisé une classe qui encapsule TSQLQuery dans un auto_ptr. J'ai utilisé l'idiom RAII, et ajouter des opérateurs d'assignations et de cast pour std::string, int, ulint, bool et TDateTime.

    Ce qui me permet d'écrire, ceci ( version très simplifiée ).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    std::string firstname, lastname;
    TDateTime birthdate;
    int sex;
     
    SqlQuery query( sqlConnector, "SELECT FIRSTNAME, LASTNAME, BIRTHDATE, SEX FROM USER WHERE ID = :ID" );
    query( "ID", id_user )();
    if( !query.empty() ) {
        firstname = query["FIRSTNAME"];
        lastname = query["LASTNAME"];
        birthdate = query["BIRTHDATE"];
        sex = query["SEX"];
    }
    Voilà,

    Alors si quelqu'un a quelque chose de similaire et qu'il désire le faire partager, je suis preneur.

    Bonne journée

Discussions similaires

  1. Besoin d'aide pour mon wrapper, les données sont faussées
    Par teddyalbina dans le forum C++/CLI
    Réponses: 9
    Dernier message: 20/05/2008, 21h46
  2. [Kylix] quelqu'un pouvez m'envoyer Kylix 2
    Par tassous10 dans le forum EDI
    Réponses: 1
    Dernier message: 14/10/2002, 00h51

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