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 Discussion :

QSqlQuery::prepare() : confusion sur ce que ça fait


Sujet :

Bases de données

  1. #1
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 187
    Par défaut QSqlQuery::prepare() : confusion sur ce que ça fait
    Bonjour,

    J'essaie d'utiliser des requêtes prédéfinies afin d'insérer des milliers de lignes dans une table d'une base de donnée. Il semblerai que QT ne supporte pas la notion de "prepared statement" qui permet de faire calculer une requête à la base de donnée une seule fois afin de ne pas gréver la vitesse des insertion ultérieures. Cette notion est parfaitement intégrée dans d'autres langages/frameworks comme Java/JDBC et je vois que dans QT même avec l'appel à la méthode prepare() de l'objet QSqlQuery on ne peut pas réaliser cette opération pourtant simple. Pour que les insertions se fassent au final il faut impérativement appeler prepare() à chaque requête lancées ce qui est bien sûr contre productif !

    Si quelqu'un a une idée à soumettre je suis preneur à moins que cette fonctionnalité de base n'existe tout simplement pas (encore?) dans QT.

    Merci d'avance

    JG

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 754
    Par défaut


    Citation Envoyé par Jitou Voir le message
    Il semblerai que QT ne supporte pas la notion de "prepared statement" qui permet de faire calculer une requête à la base de donnée une seule fois afin de ne pas gréver la vitesse des insertion ultérieures.
    QT, c'est un logiciel d'Apple, ça n'a aucune connaissance de SQL ou de quelque chose d'utile.

    Qt, lui, possède un modèle QtSql, qui te permet de faire des requêtes préparées, il suffit de lire la doc : http://qt.developpez.com/doc/4.7/sql-sqlstatements/.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 187
    Par défaut
    Merci de me donner un lien vers la doc de Qt je savais où la trouver et je n'ai rien lu qui me dit que Qt supporte effectivement les prepared statement et pour l'instant c'est vérifié en mettant en oeuvre leur exemple mais je veux y croire encore et c'est pour ça que je cherche une réponse un peu plus élaborée pour valider ou infirmer cela.

  4. #4
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 754
    Par défaut
    Sous Inserting, Updating, and Deleting Records, on trouve :

    If you want to insert many records at the same time, it is often more efficient to separate the query from the actual values being inserted. This can be done using placeholders. Qt supports two placeholder syntaxes: named binding and positional binding. Here's an example of named binding:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
         QSqlQuery query;
         query.prepare("INSERT INTO employee (id, name, salary) "
                       "VALUES (:id, :name, :salary)");
         query.bindValue(":id", 1001);
         query.bindValue(":name", "Thad Beaumont");
         query.bindValue(":salary", 65000);
         query.exec();
    Here's an example of positional binding:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
         QSqlQuery query;
         query.prepare("INSERT INTO employee (id, name, salary) "
                       "VALUES (?, ?, ?)");
         query.addBindValue(1001);
         query.addBindValue("Thad Beaumont");
         query.addBindValue(65000);
         query.exec();
    Both syntaxes work with all database drivers provided by Qt. If the database supports the syntax natively, Qt simply forwards the query to the DBMS; otherwise, Qt simulates the placeholder syntax by preprocessing the query. The actual query that ends up being executed by the DBMS is available as QSqlQuery::executedQuery().

    When inserting multiple records, you only need to call QSqlQuery::prepare() once. Then you call bindValue() or addBindValue() followed by exec() as many times as necessary.

    Besides performance, one advantage of placeholders is that you can easily specify arbitrary values without having to worry about escaping special characters.
    Ce n'est pas ce que tu cherches ?
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  5. #5
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 187
    Par défaut
    L'exemple que j'ai mis en oeuvre est le deuxième mais il a un inconvénient majeur c'est qu'on ne peut pas faire un reset explicite des valeurs bindées. Par exemple dans le cas où on gère une erreur en cours de construction de la requête (une valeur valide mais fonctionnellement non conforme), ce qui est gênant au prochain appel où l'on risque sans s'en rendre compte de binder plus de valeurs que prévues (ce que mon test à pu montrer). En effet le seul cas ou le reset implicite à lieu c'est après un appel à exec().

    Je vais par contre tenter le premier exemple ou le pb de reset ne se pose pas à priori pour peu que l'on prenne la peine de binder toute les valeurs (même celles qui sont null ou ne sont pas définies).

    (update)

    Le premier exemple est le bon ! Je le préfère aussi pour une meilleur lisibilité, tant mieux ... Donc pour répondre à ma question initiale, oui les "prepared statement" fonctionnent avec Qt et il faut faire attention aux requêtes partiellements remplies et qui n'ont pas été exécutées pour ne pas faire planter une boucle répétitive d'insertion par ex.

    Solution trouvée donc et merci encore.

    JG

Discussions similaires

  1. [Débutant] Test d'application impossible pour le moment, besoin d'avis sur ce que j'ai fait
    Par patxy dans le forum Développement Web avec .NET
    Réponses: 0
    Dernier message: 17/04/2012, 11h19
  2. [XSLT] Aide pour comprendre ce que ça fait
    Par be_tnt dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 03/11/2006, 15h38
  3. [Société] Précisions sur ce que j'avais dit
    Par Gilles Louïse dans le forum La taverne du Club : Humour et divers
    Réponses: 2
    Dernier message: 10/07/2006, 09h49

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