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 :

Erreur incompréhensible avec une condition if et une requête SQL


Sujet :

Bases de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2010
    Messages : 126
    Points : 69
    Points
    69
    Par défaut Erreur incompréhensible avec une condition if et une requête SQL
    Bonsoir a tous, je fais appelle a vous car j'ai grand besoin de votre aide.
    tout d'abord voici le code qui ma posé probleme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     /*QString*/  numDerniereFiche = numDerniereFicheCom(); // cet variable a été declarée un peu plus haut
     
     
             QString isbn = livre1LineEDIT->text();
             QString qte = qte1LineEdit->text();
     
     
     
            if (  !isbn.isEmpty() &&  !qte.isEmpty() )
            {
     
                QSqlQuery y;
     
               if (y.exec("INSERT INTO commande(libelleCommande, dateCommande, nbLivres, idClientEtranger) VALUES ( '1', '1', '1', '1')"))
    Il faut savoir que la fonction numDerniereFicheCom(); et une fonction qui retourne le numero de la derniere commande enregistrer.

    Le probleme et que lorsque je met ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numDerniereFiche = numDerniereFicheCom();
    la condition qui suit juste apres (if(requete)) n'est pas bonne, je vais donc dans le else.
    Toutefois lorsque je fais ceci :
    mon if avec ma requete fonctionne, et sa je ne comprend absolument pas pourquoi sa marche lorsqu'on affecte un entier ou une chaine dans la variable et pourquoi sa ne marche pas lorsque je met la fonction a la place qui elle aussi retourne un entier de plus il n'y a aucun rapport avec la requete et le fait d'affecter la dernier numero de la commande dans la variable.
    Cela fait 5h que je suis dessus et je ne comprend pas pourquoi cela ne marche pas.

    J'aimerai s'il vous plait (et je vous en supplie) de m'expliquer pourquoi la requete ne fonctionne pas quand on affecte la valeur d'une fonction a une variable (qui retourne un numero) et pourquoi la requete marche lorsque on affecte directement une valeur a la variable sachant qu'il n'y a aucun rapport entre la requete et le fait d'affecter un element a la variable "numDerniereFiche"

    Un grand merci a tous en tous cas

  2. #2
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 835
    Points
    2 835
    Par défaut
    Il aurait fallu tout le code pour mieux t'aider. De ce que tu en dis ta fonction numDerniereFicheCom semble mettre ta base ou ta connexion à la base en erreur, donc il faudrait voir de plus près ce qu'elle fait (j'imagine qu'elle récupère la valeur avec une requête SQL ?).

    Tu dois aussi avoir une fonction te retournant la dernière erreur SQL ou de connexion à la base, il faut que tu l'affiches quelque part, ça t'aidera à trouver la raison de l'erreur.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2010
    Messages : 126
    Points : 69
    Points
    69
    Par défaut
    d'accord .
    Tout d'abord voici la fonction numDerniereFicheCom() qui retourne le numero de la derniere fiche de commande qui à été enregistré dans la base de donnéés
    (elle retourne un QString)

    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
    numDerniereFicheCom()// affiche le numero de la derniere commande
    {
     
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); // on charge le driver de la BDD qu'on utilise
        db.setHostName("localhost");
        db.setUserName("root");
        db.setPassword("");
        db.setDatabaseName("PointVirgule");
     
        QString numDerniereCommande;
     
     
        if (db.open())
        {
     
            QSqlQuery query;
     
            if (query.exec("SELECT numCommande FROM commande WHERE numCommande =  (SELECT MAX(numCommande) FROM commande)"))
            {
     
                if (query.next() == true)
                {
                    numDerniereCommande = query.value(0).toString();
                }
                else
                {
                    QMessageBox::information(this, "numero de la derniere commande", "aucun numero");
                }
     
            }
            else
            {
                QMessageBox::critical(this, "numero de la derniere commande", "Réponse non trouvé !");
            }
        }
        else
        {
            QMessageBox::critical(this, "Connexion à la base de donnée", "Echec connexion !");
        }
     
        db.close();
        return numDerniereCommande;
    }

    je l'utilise ensuite dans une des méhodes de la meme classe afin d'enregistrer les livres associés à ce numero de Fiche de commande que retourne la fonction numDerniereFicheCom()

    voici cette méthode qui s'appelle enregistrerLivres()
    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
    51
    52
    53
    54
    55
    56
    enregistrerLivres()
    {
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); // on charge le driver de la BDD qu'on utilise
        db.setHostName("localhost");
        db.setUserName("root");
        db.setPassword("");
        db.setDatabaseName("PointVirgule");
     
     
        if (db.open())
        {
     
            QString numDerniereFiche = "";
            QString isbn = livre1LineEDIT->text();
            QString qte = qte1LineEdit->text();
     
            QSqlQuery query;
            numDerniereFiche = numDerniereFicheCom();
     
    /*
            if (query.exec("SELECT numCommande FROM commande WHERE numCommande =  (SELECT MAX(numCommande) FROM commande)"))// le fait de declarer puis de mettre un fonction qui retourne qqch, cela ne fonctionne pas
            {
                if (query.next() == true)
                {
                    numDerniereFiche = query.value(0).toString();
                }
                else
                {
                    QMessageBox::information(this, "numero de la derniere commande", "aucun numero");
                }
     
     
            }
    */
     
            if (  !isbn.isEmpty() &&  !qte.isEmpty() )
            {
     
                if (query.exec("INSERT INTO contenir(numCommandeEtranger, isbnEtranger, qteCommandee) VALUES ('"+numDerniereFiche+"', '"+isbn+"', '"+qte+"')"))
                {
                    QMessageBox::information(this, "Enregistrement", "la fiche commande est enregistré !'"+numDerniereFiche+"'ererr");
                }
                else
                {
                    QMessageBox::critical(this, "Enregistrement", "L'enregistrement a échoué ! : '"+query.lastError().text()+"'");
                }
            }
        }
     
        else
        {
            QMessageBox::critical(this, "Connection à la base de donnée", "Echec connection  BESRA! '"+db.lastError().text()+"'");
        }
     
        db.close();
    }
    le probleme qui se pose est que lorsque j'affecte la valeur de la fonction a la variable numDerniereFiche (numDerniereFiche = numDerniereFicheCom(),
    la requete qui se trouve juste en dessous ne fonctionne pas et bloque mon programme.
    J'ai verifier avec une messageBox pour voir si la variable a qui on affecte la valeur que retourne la fonction me retourne bien le numero de la derniere fiche commande, est bien je confirme que la fonction fonction est qu'elle me retourne bien la valeur de la derniere fiche commande. Je ne comprend pas pourquoi cela coince mon programme. Alors pour essayer de comprendre pourquoi cela faisait planter mon programme j'ai declaré la variable QString numDerniereFiche en lui affectant la valeur que retourne la fonction au dessus de if(db.open()), et bien cette fois ci, c'est l'iteration avec la condion db.open() qui ne marche pas, je le sais car pour une raison que j'ignore j'ai une messagebox qui s'affiche et qui me dit que le driver de la base de donner n'est pas charger.

    Ensuite j'ai decider de remplacer la fonction par ce bout de code qui se trouve dans la fonction qui retourne le derniere enregistrement du numero de la fiche commande.

    Voici ce 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
     
            if (query.exec("SELECT numCommande FROM commande WHERE numCommande =  (SELECT MAX(numCommande) FROM commande)"))// le fait de declarer puis de mettre un fonction qui retourne qqch, cela ne fonctionne pas
            {
                if (query.next() == true)
                {
                    numDerniereFiche = query.value(0).toString();
                }
                else
                {
                    QMessageBox::information(this, "numero de la derniere commande", "aucun numero");
                }
     
     
            }
    et la je ne sais pas pourquoi, tout marche correctement ....
    Lorsque j'utilise la fonction, tout le code source qui se trouve en dessous de celui ci plante par contre quand je prend le morceau de code de la fonction numDerniereFicheCom() (celui qui me retourne le dernier enregistrement de la fiche commande) et que je le met dans la méthode qui enregistre les livres ( à la place de l'utilisation de la fonction pour dire autrement) tout fonctionne et je ne sais absolument pas pourquoi .
    Et j'aimerai regler ce probleme car cela m'empeche de creer des fonctions qui retourne des valeurs car si je l'utilise quelque part tout le code qui precede l'appelle de la fonction plante. je ne comprend pas pourquoi.

    Voila j'espere avoir été clair et que vous m'aideriez a regler ce probleme plus que genant.
    Un grand merci a tous.

    PS : j'ai un ami qui me dit que cela est peut etre due a un probleme de thread, je ne c'est absolument pas a quoi cela correspond mais bon je vous le dit au cas ou.

    Merci

  4. #4
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 835
    Points
    2 835
    Par défaut
    Tu remarqueras que dans ton code tu crées une connexion à ta base de données dans chaque fonction (pour chaque tâche donc). Voilà un résumé de ton code qui fait ressortir le problème :

    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
    enregistrerLivres()
    {
        QSqlDatabase db = ... 
        db.open(); // connexion à la base
     
        // appel de numDerniereFicheCom() qui contient ceci
    /*  QSqlDatabase db = ... 
        db.open(); // connexion à la base
        // requête...
        db.close();
    */
     
        // autre requête
        db.close();
    }
    Dans ta fonction numDerniereFicheCom tu crées une nouvelle connexion à la base, que tu fermes (ligne 10). Ce qui est implicite c'est que Qt ne gère qu'une seule connexion pour une base, donc en fermant ta connexion dans cette fonction, tu fermes probablement la connexion que tu as créée au tout début, et donc les requêtes effectuées après l'appel de numDerniereFicheCom échouent.

    Quand tu as rassemblé ton code pour qu'il n'utilise qu'un seul objet db, tu n'as plus eu de problème.

    Si ces fonctions font partie d'une classe, je te suggère de mettre l'objet db en attribut et d'en utiliser un unique pour toutes tes requêtes.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2010
    Messages : 126
    Points : 69
    Points
    69
    Par défaut
    ok, d'accord, un grand merci a toi en tout cas pour ton aide, j'etais pas pret de penser que c'etait un probleme de double connexions.
    Par contre, j'ai un souci ... tu me demandes de mettre db en attribut dans la classe concerné. Ce que j'ai fait bien sur . Mais quand est ce que je ferme la connexion ? En effet si je met db en attribut et que dans le constructeur de la classe j'ouvre une connexion a la base de donné, je ne peux pas, plus loin dans le constructeur fermer la connexion car juste apres avoir établit une connexion, je la ferme de suite. Je ne peux pas non plus fermer la connexion dans les methodes de la classe car si je ferme la connexion dans une des methodes de cette classe les autres méthodes n'auront plus acces à la base de donnée.
    Comment est ce que je pourrais fermer ma connexion.

    Merci

  6. #6
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 835
    Points
    2 835
    Par défaut
    Dans le destructeur de cette même classe.

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 111
    Points : 195
    Points
    195
    Par défaut
    Citation Envoyé par momo-ben2A Voir le message
    d'accord .
    Tout d'abord voici la fonction numDerniereFicheCom() qui retourne le numero de la derniere fiche de commande qui à été enregistré dans la base de donnéés
    (elle retourne un QString)

    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
    numDerniereFicheCom()// affiche le numero de la derniere commande
    {
     
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); // on charge le driver de la BDD qu'on utilise
        db.setHostName("localhost");
        db.setUserName("root");
        db.setPassword("");
        db.setDatabaseName("PointVirgule");
     
        QString numDerniereCommande;
     
     
        if (db.open())
        {
     
            QSqlQuery query;
     
            if (query.exec("SELECT numCommande FROM commande WHERE numCommande =  (SELECT MAX(numCommande) FROM commande)"))
            {
     
                if (query.next() == true)
                {
                    numDerniereCommande = query.value(0).toString();
                }
                else
                {
                    QMessageBox::information(this, "numero de la derniere commande", "aucun numero");
                }
     
            }
            else
            {
                QMessageBox::critical(this, "numero de la derniere commande", "Réponse non trouvé !");
            }
        }
        else
        {
            QMessageBox::critical(this, "Connexion à la base de donnée", "Echec connexion !");
        }
     
        db.close();
        return numDerniereCommande;
    }
    la compilation ne te signale pas un avertissement pour la valeur de retour de cette fonction ?
    sinon ajoute cette ligne après l'appel de cette fonction pour afficher la valeur de retour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    numDerniereFiche = numDerniereFicheCom();
    qDebug() <<  numDerniereFiche;
    parce que je suis pas sûr que ta fonction retourne un QString!

Discussions similaires

  1. [XL-2010] probléme avec une condition sous toute une colonne
    Par Fawez dans le forum Excel
    Réponses: 1
    Dernier message: 12/06/2010, 13h18
  2. Réponses: 6
    Dernier message: 24/01/2010, 22h34
  3. ERREUR incompréhensible lors de la création d'une fonction
    Par BATAK dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 15/10/2009, 23h36
  4. Réponses: 10
    Dernier message: 26/03/2008, 16h00
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 22h24

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