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 :

Tquery: passer des parametres


Sujet :

C++Builder

  1. #1
    Invité
    Invité(e)
    Par défaut Tquery: passer des parametres
    bonjour,

    donc voila j'aimerais utiliser le composant TQuery pour lancer des requetes sur ma bdd.
    j'aimerais savoir comment pouvoir passer des parametres a mes requetes

    merci

  2. #2
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Salut !

    Dans l'aide de C++ Builder, il y a un exemple mais voici le principe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Query1->SQL->Clear();
    Query1->SQL->Add("Select * from maBase where Champs=:Condition");
    Query1->Params->Items[0]->AsInteger = MonParametre;
    Query1->Open();
    OU

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Query1->SQL->Clear();
    Query1->SQL->Add("Select * from maBase where Champs=:Condition");
    Query1->Params->ParamByName("Condition")->AsInteger = MonParametre;
    Query1->Open();


    Tu remarqueras que pour passer un paramètre, on utilise les : suivi d'un nom qui te servira si tu utlises le second exemple, sinon, tu utilises le Items... qui lui prends la position de ton paramètre.

    Aussi, dans la troisième ligne de chacun des codes, tu peux remplacer le AsInteger par un AsString, selon le type du paramètre à envoyer...

    Voilà, j'espère que c'est ce que tu voulais

  3. #3
    say
    say est déconnecté
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Par défaut
    allez, je lance un pavé dans la mare...

    A quoi ça sert???
    il suffit de faire un replace dans la chaine SQL!!
    je pige pas...

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Les requêtes paramétrées sont surtout utiles si tu les prépares avant l'exécution (TQuery->Prepare()).

    Cela permet de gagner du temps lors de l'exécution de la requête.

    Si tu construis dynamiquement le SQL comme tu le suggères, tu ne peux pas préparer la requête (il faudrait le faire avant chaque exécution, ce qui n'aurait aucun intérêt !).

  5. #5
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Excusez du niveau peu élevé que j'ai en SQL ...

    Moi, je crée souvent mon SQL dynamiquement mais d'après la remarque de josse95, je me pose maintenant la question à savoir quand préparer une requête ...
    On m'a conseillé d'écrire le SQL en dur dans le code, comme celà, lors d'un debug, c'est plus clair ... on sait directement ce que la requête fait

    J'ai fait une petite appli, qui prends des paramètres en compte dans mes requêtes SQL, mais je ne les prépares jamais ! J'écris ma requête, et, je l'utilise juste derrière.

    Citation Envoyé par say
    A quoi ça sert???
    il suffit de faire un replace dans la chaine SQL!!
    je pige pas...
    Je vois pas trop ta méthode

  6. #6
    say
    say est déconnecté
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Par défaut
    Je n'ai moi non plus, jamais approfondi la notion consistant à préparer une requête.

    La méthode que j'utilise consiste à avoir une séquence SQL en dur dans le le code mais plus généralement dans mon cas dans un fichier. A chaque fois que je récupère le SQL dont j'ai besoin, j'ai un traitement qui remplace automatiquement un certain nombre de paramètre avec un AnsiReplace par exemple.

  7. #7
    Invité
    Invité(e)
    Par défaut
    en tout cas pour ma part sa me convient

    en attendant j'avais proceder de la maniere 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
    15
    16
     
       AnsiString requete;
     
       // initialisation
       MaRequeteDeTest->Close();
       MaRequeteDeTest->SQL->Clear();
     
       // construction de la requete
       requete = "SELECT DISTINCT champs1, camps2 FROM table1, table2 WHERE var = ";
       requete += chaine;
       requete += ";";
     
       // ajout de la requete
       MaRequeteDeTest->SQL->Add(requete);
     
       MaRequeteDeTest->Open();
    merci pour l'aide

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Tout dépend de la taille de la base de données qu'on manipule et des performances qu'on souhaite avoir.

    Pour ma part, j'ai pu voir une nette différence de performances entre les requêtes préparées et les autres sur une base de données Oracle assez conséquente. Je n'utilisais pas les TQuery mais directement OCI, cela dit, ce sont les mêmes principes.

    Pour manipuler une petite base de données, c'est vrai que rien ne vaut la simplicité.

  9. #9
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Citation Envoyé par josse95
    Pour manipuler une petite base de données, c'est vrai que rien ne vaut la simplicité.
    Ok! Ca va alors ! Merci de cette réponse et à l'avenir, je me poserai la question afin de préparer ou non une requête.

    Merci

  10. #10
    say
    say est déconnecté
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Par défaut
    Citation Envoyé par josse95
    Tout dépend de la taille de la base de données qu'on manipule et des performances qu'on souhaite avoir.

    Pour ma part, j'ai pu voir une nette différence de performances entre les requêtes préparées et les autres sur une base de données Oracle assez conséquente. Je n'utilisais pas les TQuery mais directement OCI, cela dit, ce sont les mêmes principes.

    Pour manipuler une petite base de données, c'est vrai que rien ne vaut la simplicité.
    de vraies différences de performances? ça m'intéresse...

    en réalité, il se passe quoi lorsqu'on prépare la requête?

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    A vrai dire, le gain de performances n'est pas tant lié à la taille de la base de données qu'au nombre de requêtes que tu exécutes.

    Pour t'en convaincre.

    Fais toi même ce test. Avec le module base de données de C++ Builder, crée une table Paradox à deux champs (le premier de type Integer (et index primaire), le deuxième de type A(20) (index secondaire unique));

    1er test, code exécuté:

    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
    18
            char s[80];
            time_t t0;
     
            Query1->Close();
            Query1->SQL->Clear();
            Query1->SQL->Add("Insert into test values(:Index,:Valeur)");
            Query1->Prepare();
     
            t0 = time(0);
            for (int i=1;i<50000;i++)
            {
                    Query1->Params->Items[0]->AsInteger = i;
                    Query1->Params->Items[1]->AsString = IntToStr(i);
                    Query1->ExecSQL();
            }
            Query1->UnPrepare();
            sprintf(s,"%d sec",time(0)-t0);
            ShowMessage(s);
    Résultat: 3 sec

    2ème test:

    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
            char s[80];
            char sql[80];
            time_t t0;
     
            Query1->Close();
     
            t0 = time(0);
            for (int i=1;i<50000;i++)
            {
                    Query1->SQL->Clear();
                    sprintf(sql,"Insert into test values(%d,'%d')",i,i);
                    Query1->SQL->Add(sql);
                    Query1->ExecSQL();
            }
            sprintf(s,"%d sec",time(0)-t0);
            ShowMessage(s);
    Résultat: 175 sec

    Pour les deux tests, je suis parti du même état initial de la table (table vide).

    Si ça, ce n'est pas probant !

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

Discussions similaires

  1. faire passer des parametres dans l'url
    Par Freyja dans le forum Réseau/Web
    Réponses: 2
    Dernier message: 21/08/2006, 15h57
  2. Réponses: 2
    Dernier message: 21/05/2006, 09h30
  3. passer des parametres à l'application
    Par wickramben dans le forum JWS
    Réponses: 2
    Dernier message: 12/04/2006, 19h07
  4. Réponses: 2
    Dernier message: 04/10/2005, 20h54
  5. [script SQL]comment passer des parametres a un scrip sql?
    Par la7su dans le forum Langage SQL
    Réponses: 5
    Dernier message: 23/03/2005, 10h55

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