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

JDBC Java Discussion :

preparedStatement - problème avec mon select : aucune valeur retournée


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 18
    Points : 10
    Points
    10
    Par défaut preparedStatement - problème avec mon select : aucune valeur retournée
    Bonjour,

    Je cherche à faire un select via un preparedStatement.

    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
     
      Connexion l_o_connect = new Connexion(); 
      HashMap l_o_map = new HashMap();
     
       String l_s_listeId = "'777KV4MR', '777KV66O'";
       PreparedStatement l_o_requete = 
        l_o_connect.getConnection().prepareStatement(
          "select distinct( u.rid), m.numero from table1 u, table2 m  where m.rid = u.rid " + 
         "and u.ccf_ost_rid in (?)");
     
       l_o_requete.setString(1, l_s_listeId );
     
       // selection effective
       ResultSet l_o_rs = l_o_requete.executeQuery();
     
       // traitement des données
       while (l_o_rs.next())
       {
         // mon traitement
       }
    Le problème est que mon resultset est systematiquement vide. Je ne passe jamais dans la boucle du while.

    Or lorsque j'execute cette même requete directement dans PLSQL/developper je recupère bien des données.

    De même que si je fais (en ayant construit ma requete au préalable)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Statement stmt_name = l_o_connect.getConnection().createStatement();
        ResultSet l_o_rs = stmt_name.executeQuery(requete);
    Je ne comprend pas d'où vient mon problème.
    "Mais il faut pourtant croire ce que meme les anges oublient..." Cox - les anges

  2. #2
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    As tu essayé d'exécuter la requête directement, c'est à dire :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PreparedStatement l_o_requete = l_o_connect.getConnection().prepareStatement( "select distinct( u.rid), m.numero
    from table1 u, table2 m
    where m.rid = u.rid
    and u.ccf_ost_rid in ('777KV4MR', '777KV66O')");
    ResultSet l_o_rs = l_o_requete.executeQuery();
    Si ça marche pas, as-tu essayé d'imprimer le résultat de ta requête ?
    Etre ou ne pas être, telle est la question sinusoïdale de l'anachorète hypocondriaque et vice et versa .
    Bonsai monsieur, bonsai madame, vous avez gagnez un milliard de degrés au soleil .
    There is no cure for stupidity (ou pas ).

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Sinon j'ai aussi essayer à la place de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     PreparedStatement l_o_requete = 
        l_o_connect.getConnection().prepareStatement(
          "select distinct( u.rid), m.numero from table1 u, table2 m  where m.rid = u.rid " + 
         "and u.ccf_ost_rid in (?)");
     
       l_o_requete.setString(1, l_s_listeId );
    De faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     PreparedStatement l_o_requete = 
        l_o_connect.getConnection().prepareStatement(
          "select distinct( u.rid), m.numero from table1 u, table2 m  where m.rid = u.rid " + 
         "and u.ccf_ost_rid in ?");
     
      l_o_requete.setString(1, "(" + l_s_listeId + ")") ;
    Mais ça ne marche pas mieux.

    (après avoir lu ici que pour un like il fallait metre les % dans le setString et pas dans la chaine du preparedStatement)
    "Mais il faut pourtant croire ce que meme les anges oublient..." Cox - les anges

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par AL1986 Voir le message
    As tu essayé d'exécuter la requête directement, c'est à dire :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PreparedStatement l_o_requete = l_o_connect.getConnection().prepareStatement( "select distinct( u.rid), m.numero
    from table1 u, table2 m
    where m.rid = u.rid
    and u.ccf_ost_rid in ('777KV4MR', '777KV66O')");
    ResultSet l_o_rs = l_o_requete.executeQuery();
    Si ça marche pas, as-tu essayé d'imprimer le résultat de ta requête ?
    Non je n'ai pas essayé comme ça.

    J'y vais de ce pas.

    Quand à "imprimer le résultat de ma requête" tu veux dire quoi par là?

    Au debuggeur quand je regarde le sql de mon preparedStatement j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT( U.RID), 		M.NUM FROM TABLE1 U,      TABLE2 M WHERE M.RID = U.RID  AND U.RID IN (?)
    "Mais il faut pourtant croire ce que meme les anges oublient..." Cox - les anges

  5. #5
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par AL1986 Voir le message
    As tu essayé d'exécuter la requête directement, c'est à dire :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PreparedStatement l_o_requete = l_o_connect.getConnection().prepareStatement( "select distinct( u.rid), m.numero
    from table1 u, table2 m
    where m.rid = u.rid
    and u.ccf_ost_rid in ('777KV4MR', '777KV66O')");
    ResultSet l_o_rs = l_o_requete.executeQuery();
    Donc oui comme ça ça fonctionne Merci de ton aide

    Donc ma requete fonctionne...

    Mais pourquoi avec le ? ça ne veux pas marcher? La j'avoue que je n'y comprend rien. Surtout que ma clause IN est construite dynamiquement, j'ai donc besoin que ça fonctionne.

    Si ça peux aider les champs RID sont des varchar
    "Mais il faut pourtant croire ce que meme les anges oublient..." Cox - les anges

  6. #6
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    Citation Envoyé par titounne Voir le message
    Quand à "imprimer le résultat de ma requête" tu veux dire quoi par là?
    Je veux dire afficher le résultat pour voir s'il y a bien qqch.

    Citation Envoyé par titounne Voir le message
    Donc ma requete fonctionne...
    et comme ça
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PreparedStatement l_o_requete = l_o_connect.getConnection().prepareStatement( "select distinct( u.rid), m.numero
    from table1 u, table2 m
    where m.rid = u.rid
    and u.ccf_ost_rid in ("+l_s_listeId+")");
    ResultSet l_o_rs = l_o_requete.executeQuery();
    ça donne quoi ?
    Etre ou ne pas être, telle est la question sinusoïdale de l'anachorète hypocondriaque et vice et versa .
    Bonsai monsieur, bonsai madame, vous avez gagnez un milliard de degrés au soleil .
    There is no cure for stupidity (ou pas ).

  7. #7
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par AL1986 Voir le message
    Je veux dire afficher le résultat pour voir s'il y a bien qqch.
    Ben dans TOAD oui, et je recupere bien des données

    et comme ça
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PreparedStatement l_o_requete = l_o_connect.getConnection().prepareStatement( "select distinct( u.rid), m.numero
    from table1 u, table2 m
    where m.rid = u.rid
    and u.ccf_ost_rid in ("+l_s_listeId+")");
    ResultSet l_o_rs = l_o_requete.executeQuery();
    ça donne quoi ?
    Ca marche aussi

    Je suis sure que c'est un truc tout bête que je ne voit pas.
    "Mais il faut pourtant croire ce que meme les anges oublient..." Cox - les anges

  8. #8
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Qu'est ce que l_s_listeId ? Un string ?

    Est-t'il correctement construit ? Tu peux l'afficher ?
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  9. #9
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par in Voir le message
    Qu'est ce que l_s_listeId ? Un string ?

    Est-t'il correctement construit ? Tu peux l'afficher ?
    Oui c'est un string.

    Je le construit comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    String l_s_listeId = "";
     
    while ( l_o_iterateur.hasNext()) 
    {
    	monObjet l_o_monObjet = 
    		(monObjet)l_o_iterateur.next();
     
    	if(!l_s_listeId.equals(""))
    		l_s_listeId = l_s_listeId + ", ";
     
    	l_s_listeId = l_s_listeId + "'" + l_o_monObjet.getG_s_rid() + "'";
     
    }
    "Mais il faut pourtant croire ce que meme les anges oublient..." Cox - les anges

  10. #10
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Je suis pas sûr de ce que je vais dire mais ...

    le preparedStatement gère les caractère spéciaux à ta place. En l'occurrence il ajoute lui-même les ' ' nécessaires. Dans ton cas vu que tu as des ' ', peut être qu'il les échappe en les doublant ...

    As tu essayer de faire une recherche sur le forum sur PreparedStatement et IN, il me semble que ce sujet revient assez régulièrement ..



    [EDIT] essaie avec un setObject à la place du setString, ça devrait peut être marcher ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  11. #11
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    Résumons :
    -La requête marche.
    -La l_s_listid est bein construite (puisqu'on à le résultat si on vire le ?).
    Reste à essayer avec
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    setobject(1, l_s_listid, types.varchar)
    au lieu de
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    setstring(1,l_s_listid)
    Sinon, tu peux essayer en supprimant le + entre le where et le and et mettre tout dans une même chaîne (mais je ne pense pas que cela va changer qqch).
    Sinon, c'est que la syntaxe avec un ? après le in n'est pas accéptée (sauf si tu connais des exemples qui l'utilisent).
    Etre ou ne pas être, telle est la question sinusoïdale de l'anachorète hypocondriaque et vice et versa .
    Bonsai monsieur, bonsai madame, vous avez gagnez un milliard de degrés au soleil .
    There is no cure for stupidity (ou pas ).

  12. #12
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par AL1986 Voir le message
    -La l_s_listid est bein construite (puisqu'on à le résultat si on vire le ?).
    Le problème c'est que le setString est susceptible de modifier le String créé, en doublant les ' par exemple.

    Pour les setObject, ne précise pas le type de données, sinon ça revient à faire un setString je pense ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  13. #13
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par AL1986 Voir le message
    Résumons :
    -La requête marche.
    -La l_s_listid est bein construite (puisqu'on à le résultat si on vire le ?).
    Reste à essayer avec
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    setobject(1, l_s_listid, types.varchar)
    au lieu de
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    setstring(1,l_s_listid)
    Sinon, tu peux essayer en supprimant le + entre le where et le and et mettre tout dans une même chaîne (mais je ne pense pas que cela va changer qqch).
    Sinon, c'est que la syntaxe avec un ? après le in n'est pas accéptée (sauf si tu connais des exemples qui l'utilisent).
    le
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    setobject(1, l_s_listid, types.varchar)
    ne marche pas mieux j'avais déjà essayé.

    De même que
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    setobject(1, l_s_listid)

    En effet c'est peut être un problème avec le IN qui n'accepterait pas le ?

    Je vais faire une nouvelle recherche sur le forum.

    Merci de votre aide en tout cas.
    "Mais il faut pourtant croire ce que meme les anges oublient..." Cox - les anges

  14. #14
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Bon à priori c'est impossible,

    tu as quelques pistes ici

    en gros la solution la plus simple est de générer ton PreparedStatement dynamiquement, de la même manière que tu crées l_s_listid pour placer autant de ? que nécessaire.

    Bref, va falloir patouiller un peu. Sinon t'as la solution du bon vieux Statement ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  15. #15
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Bon visiblement pour gerer un IN il faudrait mettre plusieur ? et remplacé chaque ? par le valeur que je veux y mettre...

    Cf là

    du coup ça perd quand même enormement en souplesse...
    "Mais il faut pourtant croire ce que meme les anges oublient..." Cox - les anges

  16. #16
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par in Voir le message
    Bon à priori c'est impossible,

    tu as quelques pistes ici

    en gros la solution la plus simple est de générer ton PreparedStatement dynamiquement, de la même manière que tu crées l_s_listid pour placer autant de ? que nécessaire.
    Oui c'est ce que je viens de voir...

    Mais du coup je trouve que ça perd pas mal en avantage...

    Bref, va falloir patouiller un peu. Sinon t'as la solution du bon vieux Statement ...
    Je pense que je vais en effet repasser au bon vieux statement


    Merci pour la réponse
    "Mais il faut pourtant croire ce que meme les anges oublient..." Cox - les anges

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

Discussions similaires

  1. Problème avec mon select + instr
    Par jacko842 dans le forum SQL
    Réponses: 2
    Dernier message: 10/05/2012, 16h15
  2. [Débutant] Problème avec mon programme ( Type de valeur )
    Par Jcvag44800 dans le forum VB.NET
    Réponses: 10
    Dernier message: 21/12/2011, 21h02
  3. problème avec mon lecteur CD
    Par leo13 dans le forum Périphériques
    Réponses: 3
    Dernier message: 16/08/2005, 11h21
  4. Problème avec mon firewall ...
    Par Wis dans le forum Tomcat et TomEE
    Réponses: 15
    Dernier message: 06/04/2004, 08h46
  5. [struts][JSP][select] problème avec le select
    Par redge_touch dans le forum Struts 1
    Réponses: 4
    Dernier message: 14/01/2004, 10h05

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