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 :

Caractères spéciaux


Sujet :

JDBC Java

  1. #1
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 316
    Points
    316
    Par défaut Caractères spéciaux
    Bonjour,

    Je n'arrive pas à retrouver la fonction qui permet de convertir un StringBuffer de manière à le rendre acceptable dans une requete SQL. Je voudrais remplacer les ' par des \', alors j'ai converti mon StringBuffer en string pour ensuite faire un replaceAll, mais j'ai beau mettre 1, 2, 3 ou 4 \ j'ai toujours le meme problème. en affichant la requete j'arrive bien à avoir un truc du style \', mais c'est toujours pas pris en compte par HSQL qui plante toujours au meme endroit.
    Pour info, j'ai voulu enregistrer le contenu d'un fichier dans un StringBuffer avant de le placer dans ma requete.

    Vous avez des idées ? Merci :-)

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 97
    Points : 77
    Points
    77
    Par défaut
    Il faut que tu utilise un PreparedStatement dans lequel tu mets
    ta requête SQL où tu remplaces le mot contenant le caractères spécial par le caractère "?".

    Ensuite sur ton instance de preparedStatement tu utilises la
    méthode setString(1, "\") pour remplacer ton prémier "?" par le mot contenant le caractère special.

    Ensuite tu fais executeQuery().

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 109
    Points : 122
    Points
    122
    Par défaut
    sinon, en général, en SQL il faut doubler les quotes pour les échapper ('' et non \')

  4. #4
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 316
    Points
    316
    Par défaut
    Merci

    Je ne connaissais pas les preparedStatement. Par contre j'ai encore un soucis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    String requete = "INSERT INTO Contrat VALUES (null,4,?,'ererererer','1/1/2200','1/1/55554','',now());
    	if (getFichier().isFile())
    	{
    		try {
    			ps =  clu.getConnection().prepareStatement(requete);
    			flot = new FileInputStream(getFichier());
    			ps.setBinaryStream(1, flot, (int) getFichier().length());
    			ps.executeUpdate();
    		}
    		catch (SQLException ex) { e = new Erreur(ex.getMessage()); }
    		catch (FileNotFoundException fnfe ) { e = new Erreur("TODO :fichier non trouve."); }
    		finally { try {ps.close(); } catch (Exception ex2) {} }			
    	}
    Théoriquement, le preparedStatement aurait du me remplacer mon "?" par un contenu de type Blob, mais il n'en est rien, et le point d'interrogation reste planté là...
    Vous voyez d'ou ça peut venir ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 97
    Points : 77
    Points
    77
    Par défaut
    Et si tu crées un object Blob et que tu l'insère dans ta requête
    avec prepareStmt.setBlob (1, blob) ?

  6. #6
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 316
    Points
    316
    Par défaut
    Heuuu je suis en train de péter une durite là...
    T'aurais pas un exemple pour convertir un stringbuffer en blob... ?
    J'a bien essayé un .toString().getBytes() pour avoir un byte[] étant donné qu'il paraitrait qu'un blob ne soit qu'un byte[], mais ... marche pas...

    C'est quand meme dingue que ce foutu setBinaryStream fasse rien !

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 97
    Points : 77
    Points
    77
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ps =  clu.getConnection().prepareStatement(requete);
    flot = new FileInputStream(getFichier());
    int available = flot.available ();
    byte[] data = new byte[available];
    flot.read (data);
    SerialBlob blob = new SerialBlob (data);
    ps.setBlob (1, blob);
    ps.executeUpdate();
    Voila j'ai pas testé mais c'est comme ça que je ferais....

  8. #8
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 316
    Points
    316
    Par défaut
    Re !

    Merci pour toutes ces précision, y'a plein de trucs que que je connaissais pas là dedans :-)

    Bon.. par contre.. je comprends pas, mais le blob n'est toujours pas inséré...

    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try{
    	String requete = "INSERT INTO Contrat VALUES (null,"+getIdClient()+"," +getFichierName()+ ",?,'" + getDescription() + "','" + dateDeb + "','" + dateFin + "','" +getCommentaire() + "',now());";
    	PreparedStatement ps = clu.getConnection().prepareStatement(requete);
    	ps.setBlob(1, getFichierStream());
    	res=ps.executeUpdate();
    	System.out.println("RESULTAT : " + res);
    }
    catch (Exception ex) { ex.printStackTrace(); }
    la fonction getFichierStream :
    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
     
    private Blob getFichierStream()
    {
    	try {
    		FileInputStream f = new FileInputStream(getFichier());
    		byte[] data = new byte[f.available()];
    		f.read(data);
    		return new SerialBlob(data);
    	}
    	catch (FileNotFoundException fnfe) {fnfe.printStackTrace(); }
    	catch (IOException ioex) { ioex.printStackTrace(); }
    	catch (SerialException se) { se.printStackTrace(); }
    	catch (SQLException sqle) { sqle.printStackTrace(); }
    	return null;
    }
    Et enfin la sortie standard, ou j'ai une SQL Exception parce qu'il ne comprend pas le "?" qui n'a pas été remplacé par le blob :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    java.sql.SQLException: Wrong data type in statement [INSERT INTO Contrat VALUES (null,5,'Classeur1.xls',?,'aqwawaw','1/1/2003','1/1/2005','',now());]
    	at org.hsqldb.jdbc.Util.throwError(Unknown Source)
    	at org.hsqldb.jdbc.jdbcPreparedStatement.executeUpdate(Unknown Source)
            at...
    Ca m'enerve... J'ai essayé de mettre tout betement le fichier avec tous les byte convertis en hexadecimal aussi... Mais ça me sort des erreurs du type
    wrong data type: hexadecimal string with odd number of characters

    Je sais pas si c'est hsqldb ou moi ki foire mais je pete un cable...

    Encore merci Grand Sorcier pour ton aide précieuse !

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 97
    Points : 77
    Points
    77
    Par défaut
    Bon he bien là je dois avouer que je suis un peu à cours d'idée.
    Ce ne serait pas un bug de HSQL par hasard ?

    Est-ce que tu peux changer de base de données ? Il existe une autre base
    de données full Java : JavaDB/Derby

    http://db.apache.org/derby/


    Au fait, il se peut que la fonction ne lisent
    pas tout d'un coup ! Il faut donc bien controler le nombre
    de caractère réellement lus et controler ce qu'il reste à lire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int available = f.available();
    byte[] data = new byte[available];
    ...
    int remain = available;
    int pos = 0;
    while (remain > 0)
    {
       read = f.read (data, pos, remain);
       remain -= read;
       pos += read;
    }

  10. #10
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 316
    Points
    316
    Par défaut
    Salut !

    En fait, j'ai un peu abandonné la méthode du blob et du preparedStatement, parce que ça marchait vraiment pas..
    Par contre, j'ai créé des StringBuffer pour générer le contenu du fichier sous sa forme Hexadécimale, puisqu'il le fallait, et là ça a l'air de marcher...
    En tous cas tant que ça reste sous HSQLDB ça marche, si j'exporte et que je r'importe d'une table MySql ça a l'air de créer le même résultat, mais le hic c'est qu'une fois cette mise à jour faite (de mySql à Hsql), lorsque je regenere le fichier ça me sort pas le meme résultat en binaire. Je pense qu'il s'agit d'un problème de charset, mais j'arrive pas encore à le définir... Si tu as une idée ça serait super
    Un fichier texte marche très bien, mais un fichier Excel de 13 Ko est restitué sous forme de fichier de 14,1 Ko, et en éditant j'ai pu voir que les caractères un peu trop spéciaux étaient devenus une séquence d'autres caractères.

    Un vrai casse tête !!!

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 97
    Points : 77
    Points
    77
    Par défaut
    Dans ce cas encode le contenu de ton fichier en Base64...

  12. #12
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 316
    Points
    316
    Par défaut
    Salut !

    Et bien je dois dire que ton idée de Base64 après pas mal d'essais ne m'a pas réellement convaincu, car incompatible avec le type utilisé par la base de données (hexa), mais par contre, il m'a bien inspiré !
    J'ai fini par trouver le soucis au problème !
    Donc je m'explique (enfin j'essaye) :

    Le problème venait du fait que j'ouvrais un fichier binaire en mode texte, et que la retranscription des byte dans un stringBuffer n'était pas bonne, et même après quelques essais, en arrivant à recréer un fichier de même taille à l'octet près, ceux-ci étaient différents. Des caractères spéciaux convertis en "?", etc.
    Il m'a fallu, pour résoudre le problème, ouvrir le fichier en mode binaire (BufferedReader(FileInputStream)) et ne pas le stocker dans un StrtingBuffer, mais dans un BufferedOutputStream. On peut y associer directement un tableau de byte[], et là, miracle, ils sont conservés !

    Au moins j'aurai appris une leçon, c'est que c'est meme pas la peine de tenter d'ouvrir un fichier binaire en mode texte... Même en essayant tous les charsets de la création...

    En tout cas je vous remercie infiniment !

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

Discussions similaires

  1. caractères spéciaux
    Par mat10000 dans le forum Flash
    Réponses: 16
    Dernier message: 23/10/2003, 13h22
  2. Où trouver la liste des caractères spéciaux?
    Par gamez dans le forum Langage
    Réponses: 3
    Dernier message: 19/08/2003, 17h54
  3. Transformation XSL et caractères spéciaux
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 4
    Dernier message: 28/04/2003, 10h38
  4. [Sybase] filtre sur caractères spéciaux
    Par montelieri dans le forum Sybase
    Réponses: 4
    Dernier message: 07/04/2003, 16h49
  5. Traiter les caractères spéciaux
    Par ricola dans le forum Langage
    Réponses: 2
    Dernier message: 20/02/2003, 09h23

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