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
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    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 émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

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

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    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 averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 21
    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
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    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 chevronné Avatar de rberthou
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 612
    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
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    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 Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    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 >>
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 169
    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
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 16
    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 éprouvé
    Inscrit en
    Janvier 2006
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 161
    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
    Membre averti
    Inscrit en
    Janvier 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 16
    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
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    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 Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    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...
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

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