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 :

problème de œ qui ne veut pas s'nséré correctement


Sujet :

JDBC Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 162
    Points : 445
    Points
    445
    Par défaut problème de œ qui ne veut pas s'nséré correctement
    Bonjour,
    J'ai quelques problèmes d'insertion de caractères ISO-8859-15 dans une base Oracle10g.
    J'insère du texte a partir d'un fichier XML codé en ISO-8859-15, dans un CLOB. Tout le texte passe bien sauf le caractère "œ" (c'est le seul que j'au vue pour l'instant, peut être que € ne passe pas aussi)
    Je me connecte à la base par JDBC :
    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
    21
    22
     
    public ConnexionDB(){
    		try {
    			Class.forName("oracle.jdbc.driver.OracleDriver") ;
    		}
    		catch(ClassNotFoundException e) {
    			System.err.println("Erreur de chargement du driver : "+ e) ;
    		}
    		try {
    			String url = Proprietes.URLDB;
    			String user =  Proprietes.LOGIN;
    			String password = Proprietes.PASSWORD ;
    			connection = DriverManager.getConnection(url,user,password) ;
    		}
    		catch(SQLException sqle) {
    			System.err.println("Erreur lors de la connexion : " + sqle) ;
    		}
    		catch(Exception e){
    			System.out.println("Autre erreur : ");
    			e.printStackTrace();
    		}
    	}
    J'ai bien vérifié les paramètres du systeme (RH 3.1) qui est bien en ISO-8859-15, Oracle se base sur cette config normalement (si je ne me trompe pas).
    Et la dernière piste que j'ai c'est au lancement de la JVM lui passer les options :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -Duser.language=fr -Duser.country=FR
    Trouver ici :http://rollerweblogger.org/wiki/Wiki...alizationGuide

    Mais a chaque fois il me transforme ce "œ" en "S" ...

  2. #2
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Je pense que c'est plus un problème de db mais pour le vérifier (et avant de déplacer le post) peux tu essayer de faire un INSERT avec la ligne de commande ou ton outil préféré. De fermer la session, de la ré-ouvrir et de vérifier de tes accents et autres caractère bizarres sont bien conservés.
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 162
    Points : 445
    Points
    445
    Par défaut
    Comme c'est dans un CLOB j'utilise une procédure stocké pour me simplifier la tache :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    PROCEDURE insert_page(edt_id_in IN E_C.EDT_ID%TYPE,
                                     edc_titre_page_in IN E_C.EDC_TITRE_PAGE%TYPE,
                                     edc_page_index_in IN E_C.EDC_PAGE_INDEX%TYPE)
           AS
           BEGIN
           DECLARE
                     CURSOR c_pages_after IS
                             SELECT EDC_PAGE_INDEX
                          FROM     E_C
                          WHERE     EDT_ID = edt_id_in AND EDC_PAGE_INDEX >= edc_page_index_in
                          ORDER BY EDC_PAGE_INDEX DESC
                          FOR UPDATE OF EDC_PAGE_INDEX;
                  page_number c_pages_after%ROWTYPE;
     
           BEGIN
                   OPEN c_pages_after;
                LOOP
     
                     FETCH c_pages_after INTO page_number;
                      EXIT WHEN c_pages_after%NOTFOUND;
     
                     UPDATE E_C
                     SET EDC_PAGE_INDEX = (page_number.EDC_PAGE_INDEX + 1)
                     WHERE EDT_ID = edt_id_in AND EDC_PAGE_INDEX = page_number.EDC_PAGE_INDEX;
     
                END LOOP;
     
                INSERT INTO E_C (EDT_ID, EDC_TITRE_PAGE, EDC_PAGE_INDEX)
                VALUES (edt_id_in, edc_titre_page_in, edc_page_index_in);
     
                insert_empty_clob(edt_id_in, edc_page_index_in);
     
                COMMIT;
                CLOSE c_pages_after;
           END;
     
           END insert_page;
    Ca m'initialise un CLOB vide qui est remplie par la suite par :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    public static void storeCLOB(Connection con, String tableName, String primarykeyName, int id, String clobName, String clobValue) throws Exception {
     
            con.setAutoCommit(false);
            StringBuffer selectQuery = new StringBuffer();
            selectQuery.append("SELECT ").append(clobName);
            selectQuery.append(" from ").append(tableName);
            selectQuery.append(" where ").append(primarykeyName).append("= ?");
            selectQuery.append(" FOR UPDATE");
     
     
            PreparedStatement pstmt = null;
            try {
                pstmt = con.prepareStatement(selectQuery.toString());
                pstmt.setInt(1, id);
     
                ResultSet rset = pstmt.executeQuery();
     
                if (rset.next()) {
    //                récupération du CLOB :
                    oracle.sql.CLOB clob = (oracle.sql.CLOB) rset.getClob(1);
                    if (clob == null) { // ne doit jamais arriver ...
                        throw new Exception("Le CLOB n'a pas été initialisé en base");
                    }
     
    //                maintenant qu'on a le CLOB, on peut écrire dedans ...
                    Writer writer = clob.getCharacterOutputStream(); // c'est un flux ouvert directement sur la base
                    if (writer == null) {
                        throw new Exception("Impossible d'obtenir le flux d'écriture dans le CLOB");
                    }
     
                    if (clobValue != null) {
                        writer.write(clobValue);
                    }
                    writer.flush(); // c'est bon c'est en base ...
                    writer.close();
                }
                con.setAutoCommit(true);
            } catch (SQLException e) {
                throw new Exception("Erreur SQL lors de l'écriture dans le CLOB !" + e);
            } catch (IOException e) {
                throw new Exception("Erreur IO lors de l'écriture dans le CLOB !" + e);
     
            } finally {
                if (pstmt != null) {
                    try {
                        pstmt.close();
                    } catch (SQLException e) {
                        throw new Exception("Problème SQL ( "+ e.getLocalizedMessage()+" ) pendant la fermeture du statement de sélection du CLOB" + e);
                    }
                }
            }
     
        }
    Mais par mon outil préféré ( TOAD pour ne pas le citer) je peut directement éditer la valuer de mon CLOB, et j'ai bien sur fait un test en insérant à la main la valeur spéciale et elle est très bien accepté ...

  4. #4
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Cela pourrait également être un problème de conversion d'un de inputstream en quelque chose d'autre genre en considérant que xml est correct et que tu sois obligé de faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        ByteArrayInputStream is = new ByteArrayInputStream(xml.getBytes());
        InputStreamReader isr = new InputStreamReader(is, "ISO-8859-1");
    Dans ce cas il faut spécifier au stream reader le format parce qu'il a été perdu entre temps.
    En clair donne nous le bout de code qui utilise le blob ou clob et regarde (par exemple avec le debugger) jusqu'ou le caractère est conservé.
    Steve Hostettler
    est ton ami(e) et le tag aussi.

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/03/2012, 21h22
  2. Problème de session qui ne veut pas garder sa valeur
    Par pierrot10 dans le forum Langage
    Réponses: 10
    Dernier message: 23/06/2011, 12h35
  3. Problème de textbox qui ne veut pas afficher de text
    Par vinou94400 dans le forum VB.NET
    Réponses: 14
    Dernier message: 21/10/2009, 14h20
  4. problème de variable qui ne veut pas s'executer
    Par lulu.bleu dans le forum ASP.NET
    Réponses: 1
    Dernier message: 14/10/2009, 09h43
  5. Problème d'accents qui ne veut pas partir
    Par grabriel dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 23/09/2008, 10h12

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