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

Probleme si le resultat d'une requete est vide (BD mysql)


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 50
    Points : 28
    Points
    28
    Par défaut Probleme si le resultat d'une requete est vide (BD mysql)
    Bonjour,
    Je vais une application delphi utilisant une base de données mysql.
    J'ai un probleme lorsque ma requete ne doit donner aucun résultat (c'est a dire que je cherche un element non existant dans une de mes tables).

    Pour cela, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mysql_query(mysql, pChar('SELECT * FROM agents where nom='''+
       PChar(Enom.text)+''';'));
     
    Resultat:=mysql_use_result(mysql);
    et ensuite je teste avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Resultat = nil    then   showmessage('Enfin ca marche !!!');
    Le probleme, c 'est que l ordi trouve que resultat est différent de nil.
    Qu'est ce qui cloche ?

    J'ai mis mon code complet si dessous :

    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
    procedure TFDonneesAgent.BEnregistrerClick(Sender: TObject);
    Var
        Resultat: PMYSQL_RES;
        Compteurchamps:Longword;
        row: PMYSQL_ROW;
        I: Word;
    begin
     
            mysql_query(FPrincipal.mysql, pChar('SELECT * FROM agents where nom='''+PChar(Enom.text)+''';'));
     
            Resultat:=mysql_use_result(mysql);
            if Resultat = nil    then   showmessage('Enfin ca marche !!!'); 
            //si ma requete renvoie une table vide, le message "Enfin ca marche !!!" ne s'affiche pas
     
            Compteurchamps := mysql_num_fields(Resultat);
            row:= mysql_fetch_row(Resultat);
            i:=0;
     
            while ((Compteurchamps>0) and (i<=Compteurchamps - 1)) do
                begin
                .... etc
    Si vous avez un idée .. je suis preneuse.
    Merci bcp!
    Julie

  2. #2
    Membre averti Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Points : 392
    Points
    392
    Par défaut
    C'est pas clair pour moi; tu ne peut pas faire un peu de rangement, svp ?
    ....................................................................
    Aidez-vous... Dieu vous aideras et nous aussi..
    ....................................................................

  3. #3
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut
    Ce qui cloche, c'est une méconnaissance de SQL

    Lorsqu'une requète de sélection ne retourne pas de tuples, le décor SQL est malgré tout présent, ce qui permet justement de différencier ce cas d'un problème avec le serveur.

    Un select qui ne donne rien renvoie un code SQL à -100 et pas 0...

    Dans ton cas, il ne faut pas te baser sur le resultat à nil, puisque l'interrogation s'est bien déroulée.

    Je te suggère de jeter un oeil à ce tutoriel
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    Bonjour,
    Je suis tt a fait d'accord au sujet de ma mauvaise connaissance de SQL. Si je le maitrisais, je n'aurais pas besoin d'aide ;o)

    Néanmoins, je suis tjrs bloquée dans mon developpement, et malgré mes recherches sur le tuto et sur google, je ne trouve tjrs pas comment savoir si ma requete me renvoie une table vide.
    Je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mysql_query(mysql, pChar('SELECT * FROM agents where nom='''+ PChar(Enom.text)+''';'));
     
    Resultat:=mysql_use_result(mysql);  // resultat est du type PMYSQL_RES
    Ici, j'aimerais savoir si la table renvoyée est vide, i-e si ma table "Agents" ne contient aucune personne qui s'appelle comme Enom.text (c'est un TEdit).
    Comment puis je tester ma variable résultat ?
    permet de tester si la requete a fonctionnée, pas si elle est vide.
    * je ne peux pas comparer resultat a -100 (comme c'est ecrit dans le message ci dessus), delphi me dit "operateur no applicable to this operand type". Peut etre me manque t'il un comparateur ou une fonction de transformation ...

    Si quelqu'un sait comment faire ...
    Merci pr le coup de main.
    Bonne aprem
    Julie

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Dans le tuto qu'a fournit Qi130

    http://lfe.developpez.com/PasmySQL/#L6

    A la fin :

    Pour accéder au résultat de la requête, il est nécessaire d'appeler la fonction mysql_store_results qui renvoie un pointeur de type PMYSQL_RES.
    Puis on voit dasn le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     myRES := mysql_store_result(mySQLConnection);
            if (myRES <> nil) then begin
                for i := 0 to myRES.row_count - 1 do begin
    myRES.row_count te permettrait il pas de savoir combien il y a de ligne dans ton resultat ? Si c'est = à 0 alors tu n'as pas de réponse.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    ben justement, il me trouve 4 ou 5 !
    Alors que la personne n'est pas dans la base!
    C'est a rien n y comprendre.

    je fais
    Compteurchamps := mysql_num_fields(Resultat);
    et si je fais un showmesage(inttostr(Compteurchamps )), j'obtiens 4 (alors que ca devrait etre 0.)

    Du coup, apres, quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    i:=0;
    while ((Compteurchamps>0) and (i<=Compteurchamps - 1)) do
          begin
                if row[i]='' then PrenomIdentique:=1 ;
    Ca bug a l'execution au niveau de row[i], car je pense qu'il n y a pas de valeur!
    Que faire?
    Merci

  7. #7
    Membre averti Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Points : 392
    Points
    392
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'SELECT * FROM agents where nom='''+ PChar(Enom.text)+''';'
    une requete comme celle-çi ne renvoi-t-elle pas TOUS les "agents" ayant le même nom ?

    Tu peut étuliser la propriété EOF d'un composant ensemble de données pour savoir si une table ou le résultat d'une requête est vide.
    Si à l'ouverture du composant, EOF vaut true, c'est que le résultat est une table vide.
    ....................................................................
    Aidez-vous... Dieu vous aideras et nous aussi..
    ....................................................................

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    tu me mets le doute, mais je ne crois pas (enfin, c pas que que je veux faire!).
    Si dans le TEdit Enom, il y a "DUPONT"

    ma requete contient:
    SELECT* FROM agents where nom='dupont' ;
    donc je devrais obtenir toutes les infos (nom, prenom, laboratoire, institut) des personnes inscrites dans ma base qui s'appelle DUPONT. Or personne ne s'appelle dupont !
    Le compeur me trouve 4, je pense que ca correspond aux 4 valeurs nom, prenom, laboratoire, institut, peut etre avec des cases vides. Ce qui est sur, c que row[0] fait planter le programme. Pourtant, comme le compteur est a 4, row[0] devrait exister (ainsi que row[1] jusqu a row[3])!
    Julie

  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Compteurchamps := mysql_num_fields(Resultat);
    mysql_num_fields, doit amon avis retourner le nombre de champs (colonne) de ta table pas le nombre d'enregistrement (ligne) de ta table...
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  10. #10
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Malatar
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Compteurchamps := mysql_num_fields(Resultat);
    mysql_num_fields, doit amon avis retourner le nombre de champs (colonne) de ta table pas le nombre d'enregistrement (ligne) de ta table...
    C'est tout a fait possible, mais je ne sais pas comment tester que les champs renvoyés sont vides!
    Y a t'il une fonction ?
    Merci pour les réponses!

  11. #11
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    Ca y est, j'ai trouve !

    Pour verifier si une requete trouvée est vide, il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if row = nil then // le requete trouvée contient une table vide
    else   // il y a des valeurs dans la table, qui s'obtiennent grace a row[0], row[1], ...
    avec row qui s'obtient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Resultat:=mysql_use_result(FPrincipal.mysql);      
    Compteurchamps := mysql_num_fields(Resultat);
    row:= mysql_fetch_row(Resultat);
    Merci a tous pour les réponses!
    Julie

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

Discussions similaires

  1. [Smarty] probleme de resultat d'une requete
    Par kyryan dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 12/10/2012, 09h45
  2. Comment tester si une requete est vide
    Par lolocks dans le forum VB.NET
    Réponses: 4
    Dernier message: 18/05/2011, 14h16
  3. Réponses: 9
    Dernier message: 26/11/2008, 10h18
  4. tester si le résultat d'une requete est vide
    Par monstour dans le forum ASP
    Réponses: 13
    Dernier message: 04/10/2006, 14h14
  5. Réponses: 3
    Dernier message: 02/05/2006, 14h21

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