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 :

Debutant JDBC PreparedStatement


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 68
    Points : 48
    Points
    48
    Par défaut Debutant JDBC PreparedStatement
    Bonjour à tous.

    Voilà deux jours que je bute sur un simple probleme.

    Je travaille avec une base Oracle 10g, j'utilise le jdbc fournit avec le CD client d'Oracle.

    Mon problème survient lors de l'utilisation de la CLAUSE WHERE.

    En effet ce bout de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    PreparedStatement ps=conn.prepareStatement("UPDATE RLV_INDEX SET ETAT_ENREG=?, UTILMODIF=? WHERE ETAT_ENREG='STRING3'");
    		ps.setString(1, "STRING1");
    		ps.setString(2, "STRING2");
    		rc=ps.executeUpdate();
    fonctionne très bien.

    Par contre celui-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PreparedStatement ps=conn.prepareStatement("UPDATE RLV_INDEX SET ETAT_ENREG=?, UTILMODIF=? WHERE ETAT_ENREG=?");
    		ps.setString(1, "STRING1");
    		ps.setString(2, "STRING2");
    		ps.setString(3, "STRING3");
    		rc=ps.executeUpdate();
    ne fonctionne pas.

    Que je fasse des select (avec un executequery) ou des updates, ou des delete le passage d'un String à la clause where via un setString ne fonctionne pas.

    Attention quand je dis ne fonctionne pas, c'est qu'il ne me retourne aucun champ lors d'un select ou qu'il ne me fait aucune modif lors d'un update. Or l'autre méthode (avec le string en dur dans la requête), elle m'affiche bien les champs voulu ou me font bien les bonnes modifs.

    Je ne comprend vraiment pas d'où cela peut provenir, j'en appelle aux professionnels des BD via jdbc. Car dans ma boite personne n'a pu trouvé la solution.

    Ah oui, j'utilise une JDK 1.5.

  2. #2
    Membre expérimenté
    Avatar de fabszn
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2002
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2002
    Messages : 974
    Points : 1 638
    Points
    1 638
    Par défaut
    Hello,

    En effet, c'est bizarre..

    Est ce que tu as vérifié la valeur STRING3 qui est donnée dynamiquement?
    Est ce que cette valeur est correcte?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 68
    Points : 48
    Points
    48
    Par défaut
    Merci pour cette réponse très rapide!!!

    Alors pour ce qui est de la valeur STRING3, je ne peux pas la vérifier une fois la requete créé avec ses arguments.

    Par contre ce que j'ai fait, je fais un affichage de la requete SQL avant precompilation (donc avec les ?), et j'affiche les variables que je passe avec le SetString.

    J'ai repris chacune de ces données, et je les ai mis dans une PreparatedStatement (donc en substituant chacun des ? par la valeur attendu) et cela marche très bien.

    Si tu as une technique pour afficher la requête avec ses variables une fois qu'elle est intitialisée (sans passé par la librairie dont j'ai entendu parler qui a l'air assez lourde à mettre en place) je suis preneur.

    Merci d'avance...

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Questions en passant :

    - ta valeur pour le paramètre 3 (clause where), tu la fournis comment ?
    - la valeur "STRING3" est réelle ou c'est pour l'exemple ?

    Le problème pourrait être lié à l'encoding

  5. #5
    Membre confirmé

    Homme Profil pro
    Chomeur
    Inscrit en
    Juin 2006
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 347
    Points : 452
    Points
    452
    Par défaut
    Salut à tous,

    _Cheval_ as tu essaye quelquechose comme ca: update ... where ETAT_ENREG='?' ou alors dans ton string: string3="'monString'"

    Bon courage,
    Tif

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 68
    Points : 48
    Points
    48
    Par défaut
    Désolé j'étais persuadé de t'avoir répondu hier!!

    Alors STRING3 c'est pour l'exemple.

    En fait j'ai fait pas mal d'essai, tel que faire des chose comme new String ou bien encore des StringBuffer.toString(),etc....

    Donc dans mes essais différents essai j'ai essayé par exemple un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ps.setString (3,"VALEUR_CHERCHE");
    ou bien encore des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String valeur="VALEUR_CHERCHE";
    ps.setString (3,valeur);
    J'ai même essayé des choses farfelus comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String valeur="VALEUR_CHERCHE";
    ps.setString (3,valeur.trim().toString());
    En effet, peut être le problème est lié à l'encodage, donc si c'est le cas, comment pourrais je le résoudre??

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 68
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par TIFéç
    Salut à tous,

    _Cheval_ as tu essaye quelquechose comme ca: update ... where ETAT_ENREG='?' ou alors dans ton string: string3="'monString'"

    Bon courage,
    Tif
    Oui j'ai déjà essayé ces deux solutions.

    La première me lève une SQLException:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Index de colonne non valide
    La seconde quant à elle réagit de la même façon c'est à dire avec aucun champ modifié dans le cas d'un Update ou 0 champ retourné dans le cas d'un SELECT.

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Il faudrait :
    1) regarder le charset utiliser par la base/table/colonne
    2) adapter le parametre en fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pstmt.setString(3, new String(laSource.getBytes(), "ISO-8859-1");
    (Quelque chose comme ça)

    A+

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 68
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par OButterlin
    Il faudrait :
    1) regarder le charset utiliser par la base/table/colonne
    Comment puis je accéder à cette information.

    Sous toad lorsque je fais un je ne vois aucune information de ce genre.

    Quelle commande me permettrais d'accéder au charset d'un de mes champs sous Oracle.

    Ce que je sais pour l'instant (vu que c'est moi qui est créé ma table), c'est que mes champs sont des char de maximum 20 caractères.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 68
    Points : 48
    Points
    48
    Par défaut
    Bon de toute façon j'ai fait des tests avec un encodage UTF-8, ISO-8859-1, -15,etc... et quelques autres bien connus, et cela ne m'a rien changé!!

    J'en ai marre!!!!

    Je suis allé voir mon DBA qui m'assure qu'il s'agit d'un problème qui proviendrait de la partie du code Java, mais bon rien n'y fait.

  11. #11
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Des CHAR ou VARCHAR ?
    Il me semble (de mémoire) qu'il peut y avoir des différences entre les 2 sur les clauses where justement.
    Perso, j'utilise toujours VARCHAR
    Pour ce qui est des paramètres d'oracle, il faudrait faire (via sqlplus) select * from NLS_DATABASE_PARAMETER where parameter like '%CHAR%'

    Sinon, je te rassure, j'utilise une base Oracle 10 et des preparedStatement et ça fonctionne très bien

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 68
    Points : 48
    Points
    48
    Par défaut
    En fait j'utilise des CHAR suite à une longue conversation que j'ai eu avec mes DBA.

    La différence étant au niveau de la complétion des espaces, et mes données étant toutes inférieures à 20 carac, ils m'ont indiqué que l'index serait plus rapide sur des char de taille constante lors d'une recherche en base, plutôt que sur des varchar de taille variables.

    Par contre je vais tout de même recréer la base en faisant un varchar au lieu d'un char et relancer le test.

    Je te tiens au courant, et encore merci de suivre tout ca!!!

  13. #13
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    A plus tard

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 68
    Points : 48
    Points
    48
    Par défaut


    Merci mec t'es un champion!!!!!!!!

    Apres 24h de recherche intensive, c'est enfin réglé.

    Donc pour info, comme je te l'ai dit précédemment j'utilise le char pour la complétion des blancs.

    Donc comme j'ai un char de 20, lorsque je fait un insert <STRING3>, il m'insére en fait
    <STRING3 >

    et quand je lance ma recherche avec un WHERE, je croyais bêtement, que la machine s'occuperait elle même d'ajouter les blancs!!!!

    Or, grave erreur, cette feignasse de machine ne veut rien faire, et m'a laissé me débrouiller sans rien m'indiquer.


    Bon encore merci pour ton coup de main, et pour les questions que tu m'as posé qui m'ont conduit à trouver l'erreur.

    Je vais m'empresser de marquer mon sujet comme résolut!!!

    PS: Peut être aurais je une autre question à te poser concernant les default current_timestamp qui me pose problème via jdbc, mais j'y reviendrait plus tard!!!

    ENCORE MERCI...

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

Discussions similaires

  1. [debutant] jdbc
    Par stoukou dans le forum JDBC
    Réponses: 8
    Dernier message: 27/02/2006, 17h10
  2. Réponses: 1
    Dernier message: 08/11/2005, 14h32
  3. [debutant] jdbc et classpath !!!!
    Par christophebmx dans le forum JDBC
    Réponses: 7
    Dernier message: 12/09/2005, 22h22
  4. [debutant][jdbc]driver introuvable
    Par debdev dans le forum JDBC
    Réponses: 10
    Dernier message: 11/05/2005, 11h52
  5. [debutant][JDBC]
    Par zozolh2 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 24/05/2004, 18h16

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