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

QxOrm Discussion :

Erreur SQL dans une requête personnalisée


Sujet :

QxOrm

  1. #1
    Membre averti
    Avatar de Architekth
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 123
    Points : 301
    Points
    301
    Par défaut Erreur SQL dans une requête personnalisée
    Bonjour tout le monde,

    Voilà, j'ai un souci depuis 2 jours, lorsque je crée une requête personnalisée, j'ai une erreur SQL qui apparait. Cette erreur apparait aussi si j'utilise le système standard pour construire des requêtes avec QxOrm. Voici ma requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    QStringList items = curr.split("_"); // ici on obtient items.at(0) = "Balisage" et items.at(1) = "Lumiere"
    qx::QxSqlQuery tmpQuery;
    tmpQuery.query("AND ( category=\'" + items.at(0) + "\' AND type=\'" + items.at(1) + "\' )");
    Si je construis la requête de manière standard, même souci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    QStringList items = curr.split("_"); // ici on obtient items.at(0) = "Balisage" et items.at(1) = "Lumiere"
    qx::QxSqlQuery tmpQuery;
    tmpQuery.and_OpenParenthesis("category").isEqualTo(items.at(0)).and_("type").isEqualTo(items.at(1)).closeParenthesis();
    L'erreur est la suivante :

    [QxOrm] execute sql query failed : SELECT PoiDao.poikey AS PoiDao_poikey_0, PoiDao.creationdate AS PoiDao_creationdate_0, PoiDao.embeddedpoi AS PoiDao_embeddedpoi_0, PoiDao.validated AS PoiDao_validated_0, PoiDao.category AS PoiDao_category_0, PoiDao.type AS PoiDao_type_0, PoiDao.subtype AS PoiDao_subtype_0, PoiDao.description AS PoiDao_description_0, PoiDao.updatedate AS PoiDao_updatedate_0, PoiDao.status AS PoiDao_status_0, PoiDao.longitude AS PoiDao_longitude_0, PoiDao.latitude AS PoiDao_latitude_0, PoiDao.picturepath AS PoiDao_picturepath_0, PoiDao.picturesize AS PoiDao_picturesize_0, PoiDao.picturedata AS PoiDao_picturedata_0, PoiDao.reportpath AS PoiDao_reportpath_0, PoiDao.reportsize AS PoiDao_reportsize_0, PoiDao.reportdata AS PoiDao_reportdata_0, PoiDao.creatoruserlogin AS PoiDao_creatoruserlogin_0, PoiDao.updateuserlogin AS PoiDao_updateuserlogin_0, PoiDao.missionkey AS PoiDao_missionkey_0 FROM PoiDao WHERE ( creationdate >= :creationdate_2_0 AND creationdate <= :creationdate_4_0 OR updatedate >= :updatedate_6_0 AND updatedate <= :updatedate_8_0 ) AND ( PoiDao.category='Balisage' AND PoiDao.type='Lumiere' )

    QMYSQL3: Impossible d'ex?cuter la requ?te
    No data supplied for parameters in prepared statement
    SQL QUERY Error : "No data supplied for parameters in prepared statement QMYSQL3: Impossible d'exécuter la requête"



    Je comprends pas ou est le problème. La première idée qui met venu en tête était que items.at(0) et items.at(1) étaient vide, ce qui n'est pas le cas j'ai vérifié. Du coup, je vois pas ou peut bien être le problème. Je précise que je préfère utiliser la première méthode pour construire ma requête car c'est une requête extrèmement personnalisé (qui change de comportement en fonction des données utilisateur).

    Merci d'avance pour votre aide

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut


    Peux-tu nous montrer plus de code stp : depuis la construction de la requête jusqu'à l'appel à qx::dao::fetch_by_query() ?
    En effet, dans la trace SQL, on voit apparaitre ceci :
    WHERE ( creationdate >= :creationdate_2_0 AND creationdate <= :creationdate_4_0 OR updatedate >= :updatedate_6_0 AND updatedate <= :updatedate_8_0 ) AND ( PoiDao.category='Balisage' AND PoiDao.type='Lumiere' )

    Et dans ta variable tmpQuery, il n'y a que la 2ème partie de la requête !
    Où se trouve la 1ère partie de ton WHERE ?

    Je précise que je préfère utiliser la première méthode pour construire ma requête car c'est une requête extrèmement personnalisé (qui change de comportement en fonction des données utilisateur).
    Pour info, la 2ème méthode est (beaucoup) plus optimisée car elle utilise automatiquement la notion de placeholder et ton SGBD pourra stocker dans un cache ta requête SQL pour améliorer les performances (ce qui ne sera pas le cas avec ta 1ère méthode car ta requête SQL change à chaque appel).

  3. #3
    Membre averti
    Avatar de Architekth
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 123
    Points : 301
    Points
    301
    Par défaut
    Bien sur voici mon code :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
        qx::QxSqlQuery query;
        query.where_OpenParenthesis("creationdate").isGreaterThanOrEqualTo(start).and_("creationdate").isLessThanOrEqualTo(end).or_("updatedate").isGreaterThanOrEqualTo(start).and_("updatedate").isLessThanOrEqualTo(end).closeParenthesis();
        if(!categories.isEmpty())
        {
            query.and_OpenParenthesis("category").isEqualTo(categories.first());
            for(int i = 1; i < categories.size(); i++)
                query.or_("category").isEqualTo(categories.at(i));
            query.closeParenthesis();
        }
     
        if(!types.isEmpty())
        {
            qx::QxSqlQuery typesQuery;
            foreach(QString curr, types)
            {
                QStringList items = curr.split("_");
                if(items.size() >= 2)
                {
                    qx::QxSqlQuery tmpQuery;
                    tmpQuery.query("( category=\'" + items.at(0) + "\' AND type=\'" + items.at(1) + "\' )");
     
                    if(typesQuery.isEmpty())
                        typesQuery = tmpQuery;
                    else
                    {
                        QString qstr_CurrentQuery = typesQuery.query();
                        QString qstr_Query = tmpQuery.query();
                        typesQuery = typesQuery.query(qstr_CurrentQuery + " OR " + qstr_Query);
                    }
                }
            }
            if(categories.isEmpty())
            {
                QString qstr_CurrentQuery = query.query();
                QString qstr_Query = typesQuery.query();
                query = query.query(qstr_CurrentQuery + " AND " + qstr_Query);
                query.closeParenthesis();
            }
            else
            {
                QString qstr_CurrentQuery = query.query();
                QString qstr_Query = typesQuery.query();
                query = query.query(qstr_CurrentQuery + " OR " + qstr_Query);
                query.closeParenthesis();
            }
        }
     
        QVector<PoiDao *> list_Poi;
        QSqlError sql_error = qx::dao::fetch_by_query(query, list_Poi);
    categories et types étant des QStringList.

    D'accord, mais pour l'instant, quoi qu'il en soit, dans les 2 cas ça ne fonctionne pas.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Je pense que le problème est que tu travailles avec plusieurs variables de type qx::QxSqlQuery (que tu peux écrire aussi qx_query pour simplifier, si tu veux ).

    La ligne suivante réinitialise complètement ta requête et tu perds tous les paramètres qui ont été bindés auparavant, d'où l'erreur renvoyée par MySql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query = query.query(qstr_CurrentQuery + " AND " + qstr_Query);
    C'est bizarre que tu n'es pas un assert qui se soit déclenché, car il y a une vérification qui est faite en mode debug (ou alors tu travailles avec une version release de la bibliothèque QxOrm ?).

    Dans tous les cas, il faut que tu fasses ton algorithme autrement pour n'utiliser qu'une seule variable de type qx::QxSqlQuery (ou qx_query).

    Remarque : rien à voir avec ton soucis, mais pourquoi tu n'utilises pas des pointeurs intelligents ?
    Tu écris : QVector<PoiDao *> list_Poi;
    Alors que si tu utilisais QVector< QSharedPointer<PoiDao> > list_Poi; ===> aucun soucis à te faire au niveau de la mémoire.
    C'est juste une remarque comme ça

    EDIT : une info importante, tu ne peux pas mélanger les 2 méthodes d'écriture pour une qx_query. Donc si tu commences à utiliser la 2ème méthode (celle que je recommande), alors il faut que tu continues dans ton algo à utiliser cette 2ème méthode !

  5. #5
    Membre averti
    Avatar de Architekth
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 123
    Points : 301
    Points
    301
    Par défaut
    D'accord je vais essayer de travailler avec une seule qxSqlQuery alors.
    Je travail effectivement en mode Release, les .dll et .a ne sont pas sur le repository de ma boite.

    Pour ce qui est du QSharedPointer<T> je l'utilise toujours en interne (dans ma propre bibliothèque). Par contre la je suis obligé de travailler avec un std::Vector<Dao*> par la suite, et je ne peux modifier ceci car c'est géré en externe. Si je modifie en QSharedPointer, ça modifiera le code en externe. Je développe une bibliothèque qui est utilisé par un soft. Le code du soft n'est pas codé par moi, du coup je peux pas modifier les paramètres de sortie de ma fonction. Je sais pas si j'ai été clair

    Merci beaucoup pour ton aide ! Il y a donc aucun moyen pour que je puisse utiliser plusieurs qx_query et les imbriquer ensuite les uns avec les autres?

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    EDIT : une info importante, tu ne peux pas mélanger les 2 méthodes d'écriture pour une qx_query. Donc si tu commences à utiliser la 2ème méthode (celle que je recommande), alors il faut que tu continues dans ton algo à utiliser cette 2ème méthode !
    J'ai fais un EDIT important sur mon message précédent, je le remets juste pour être sur que tu le vois.

    Il y a donc aucun moyen pour que je puisse utiliser plusieurs qx_query et les imbriquer ensuite les uns avec les autres?
    Non, pour le moment, il faut que tu travailles avec une seule variable de type qx_query (en mode debug, tu aurais vu de suite qu'il y avait un problème ).
    La seule chose que tu peux utiliser est la méthode QxSqlQuery & freeText(const QString & text); pour ajouter n'importe quelle chaîne de caractères à ta requête SQL (si tu utilises la 2ème méthode d'écriture des requêtes SQL).

  7. #7
    Membre averti
    Avatar de Architekth
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2010
    Messages : 123
    Points : 301
    Points
    301
    Par défaut
    Merci beaucoup! C'est ce que j'ai fais avec FreeText() et ça fonctionne parfaitement.

    Merci d'être toujours disponible lorsqu'il y a besoin d'aide!

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

Discussions similaires

  1. Erreur 1052 dans une requête
    Par amazon dans le forum Requêtes
    Réponses: 4
    Dernier message: 08/09/2009, 15h47
  2. Utilisation de variables SQL dans une requête
    Par charliend dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 24/03/2009, 18h54
  3. Utiliser une variable PL/SQL dans une requête
    Par maxwell86 dans le forum PL/SQL
    Réponses: 2
    Dernier message: 10/12/2008, 10h34
  4. Réponses: 2
    Dernier message: 21/10/2008, 14h57
  5. Erreur 3265 dans une requête
    Par Baichette dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 16/09/2008, 12h05

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