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 :

Erreur execute Query


Sujet :

JDBC Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Points : 3
    Points
    3
    Par défaut Erreur execute Query
    Bonjour,

    Pouvez vous m'aider, avec ce code, je n'ai aucune erreur, à l'exception des momments ou le nom et/ou le prénom contiennent une apostrophe.

    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
     
    public String GetClientPhone(Connection con, String nom, String prenom){
    		String queryString = "select tel from client where nom='"+ nom +"' and prenom='"+ prenom +"'";
    		String tel="---";
    		try{
    			stmt = con.createStatement();
    			ResultSet rs = (ResultSet) stmt.executeQuery(queryString);
    			while (rs.next()) {	
    					tel=rs.getString("tel");
    			}
    			stmt.close();
    		}
    		// Close resources
    		catch(SQLException ex) {
                            ...
    		}
    		return tel;
    	}
    Donc pour régler le problème, comme pour d'autres méthodes, j'utilise les prepared statement:
    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
     
    public String GetClientPhone(Connection con, String nom, String prenom){
    		String queryString = "select tel from client where nom=? and prenom=?";
    		String tel="---";
    		try{
    			PreparedStatement preparedStatement = con.prepareStatement(queryString);
    			preparedStatement.setString(1,nom);
    			preparedStatement.setString(2,prenom);
    			ResultSet rs = (ResultSet)preparedStatement.executeQuery(queryString);		
    			while (rs.next()) {	
    					tel=rs.getString("tel");
    			}
    			preparedStatement.close();
    		}
    		// Close resources
    		catch(SQLException ex) {
                            ...
    		}
    		return tel;
    	}
    Cependant, dans ce cas j'ai une erreur lors de "l'executeQuerry"...
    Pourtant ce sont les meme données et j'utilise ce meme systeme pour obtenir dans info dans ma BD qui contiennent des apostrophes.

    Quelqu'un a-t-il quelque chose pour m'aider?

    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    ResultSet rs = preparedStatement.executeQuery();

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par the-gtm Voir le message
    ResultSet rs = preparedStatement.executeQuery();
    Cela n'y change rien... :s
    Message: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? and prenom=?' at line 1
    SQLState: 42000
    ErrorCode: 1064

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 21
    Points : 24
    Points
    24
    Par défaut
    Bonjour,


    Le setString ajoute automatiquement des quotes.

    Si tu essaies de faire un truc comme ca, ça donne quoi?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preparedStatement.setString(2,prenom.replaceAll("'","\'"));
    Je ne sais pas si cela va fonctionner, mais si c'est le cas, il doit probablement y avoir quelquechose de mieux à faire.


    Eric

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par EricMoa Voir le message
    Bonjour,


    Le setString ajoute automatiquement des quotes.

    Si tu essaies de faire un truc comme ca, ça donne quoi?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preparedStatement.setString(2,prenom.replaceAll("'","\'"));
    Je ne sais pas si cela va fonctionner, mais si c'est le cas, il doit probablement y avoir quelquechose de mieux à faire.


    Eric
    Merci Eric, j'ai déjà essayé mais le replaceAll ne replace rien ;-) ...
    Par contre j'ai remarqué que mes autres méthodes qui fonctionnaient avec mes preparedstatement ne fonctionnent plus non plus!!!
    N'est ce pas lié à la BD :s???
    Merci

  6. #6
    Membre éclairé Avatar de rberthou
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 612
    Points : 690
    Points
    690
    Par défaut
    Cela semble étrange :
    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
     
    public String GetClientPhone(Connection con, String nom, String prenom){
    		String sql = "select A.tel from client A where A.nom= ? and A.prenom= ? ";
    		String tel="---";
    		try{
    			PreparedStatement pstmt = con.prepareStatement(sql);
    			pstmt.setString(1,nom);
    			pstmt.setString(2,prenom);
    			ResultSet rs = pstmt.executeQuery();		
    			while (rs.next()) {	
    					tel=rs.getString("tel");
    			}
    			preparedStatement.close();
    		}
    		// Close resources
    		catch(SQLException ex) {
                            ...
    		}
    		return tel;
    	}
    Ce code fonctionne normalement sans aucun problème surtout avec une base Mysql, peux tu vérifier la version de ton driver Mysql.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par rberthou Voir le message
    Cela semble étrange :
    Ce code fonctionne normalement sans aucun problème surtout avec une base Mysql, peux tu vérifier la version de ton driver Mysql.
    En effet c'est étrange d'autant qu'il y a 2 semaines ca fonctionnait... :s
    Et je n'ai pas changé la version de mon driver :s

    Que faire????

  8. #8
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut Reponse possible :
    En langage SQL, le caractère quote contenu dans une chaîne alphanumérique représentant la valeur d'un enregistrement doit être doublé ! C'est une règle qui si elle n'est pas respectée se solde par une erreur de syntax SQL.
    En clair, pour qu'un enregistrement contienne la valeur suivante :
    << Tout l'univers >>
    Il faut dans la chaine SQL doubler la quote comme suit :
    << Tout l''univers >>
    Il n'y aura alors plus d'erreur de syntaxe SQL et la valeur enregistrée sera bien :
    << Tout l'univers >>

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 169
    Points : 113
    Points
    113
    Par défaut
    Ce que dit pursang est exact. Il faut donc écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preparedStatement.setString(2,prenom.replaceAll("'","''"));

  10. #10
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    Le setString est là pour encapsuler ce remplacement justement et avoir à éviter de prépocesser ta chaine avant de faire l'insert (ou autre traitement).

    Donc je ne pense pas que ce soit la solution pour ce problème...
    Après désolé mais je ne pense pas pouvoir t'aider plus que ça. Quelque chose a dû changer mais quoi ?

  11. #11
    Membre habitué
    Inscrit en
    Janvier 2006
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 161
    Points : 168
    Points
    168
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String queryString = "select tel from client where nom='"+ nom +"' and prenom='"+ prenom +"'";

    désolé, je n'ai pas tout lu mais à priori, on ne compare pas un varchar ou équivalent avec un = mais avec un like :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String queryString = "select tel from client where nom like '"+ nom +"' and prenom like '"+ prenom +"'";
    Si mon message est complètement hors sujet, veuillez m'en excuser, et simplement l'ignorer.

  12. #12
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 16
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par wtfu Voir le message
    désolé, je n'ai pas tout lu mais à priori, on ne compare pas un varchar ou équivalent avec un = mais avec un like :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String queryString = "select tel from client where nom like '"+ nom +"' and prenom like '"+ prenom +"'";
    Si mon message est complètement hors sujet, veuillez m'en excuser, et simplement l'ignorer.
    Le = en SQL vérifiera une égalité stricte.
    Le like te permettra d'utiliser des caractères "joker" comme le %...

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par laurent.c123 Voir le message
    Ce que dit pursang est exact. Il faut donc écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    preparedStatement.setString(2,prenom.replaceAll("'","''"));
    Désolé, mais ca ne marche tj pas...
    Et je ne comprends pas pourquoi mes preparestatement fonctionne pour certaines requetes et pas pour d'autres....

  14. #14
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut Dernière idée de ma part...
    Bon, puisque le doublage des quotes ne sert à rien, il me reste une idée. J'ai personnellement eu l'occasion de vivre un peu la même chose et de tourner en rond longtemp avant de comprendre que dans la syntaxe SQL il me fallait encadrer mes chaînes par des accents graves, et non par des apostrophes. Mais il s'agit là d'un cas bien précis qui ne répond peut-être pas aux mêmes contraintes que vous. En clair, j'exécutais une requete SQL du type INSERT depsui un OS hôte type LINUX vers un serveur MySQL sous windows.
    J'ai du remplacer mes requetes comme dans l'exemple ci-dessous :
    INSERT INTO 'base'.'table1' ('colonne1', 'colonne2') VALUE ('valeur1', 'valeur2');
    que j'ai du écrire
    INSERT INTO `base`.`table1`(`colonne1`, `colonne2`) VALUE ('valeur1', valeur2');

    Pour trouver cela, j'ai fini par m'appuyer sur les requetes générées et affichées dans l'exploitation de phpMyAdmin.
    Voilà, en dehors de cela, je n'ai plus d'idées pour vous aider à solutionner votre problème...

Discussions similaires

  1. Réponses: 9
    Dernier message: 18/12/2014, 08h47
  2. Réponses: 2
    Dernier message: 06/08/2010, 09h41
  3. [PHP MySQL] Erreur execution requête de type INSERT
    Par Pfeffer dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/01/2006, 17h38
  4. Réponses: 18
    Dernier message: 10/12/2005, 01h19
  5. [Ant]Erreur execution d'une tache ANT
    Par gerin dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 11/05/2004, 16h59

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