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 :

[INSERT] PreparedStatement + paramètre BLOB => plantage aléatoire


Sujet :

JDBC Java

  1. #1
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut [INSERT] PreparedStatement + paramètre BLOB => plantage aléatoire
    Bonjour,
    dans mon programme je suis sensé lire une table source qui contient une colonne de type BLOB, et insérer certaines lignes dans une table cible.

    Problème :
    De temps en temps, mes inserts plantent avec l'erreur "ORA-00942: table or view does not exist".
    Pourtant, mes inserts sont tous de la même forme :o

    Voici la partie du code concernée :

    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
    									ConnexionOracleViaJdbc connexionCibleBlob = new ConnexionOracleViaJdbc(
    											Lanceur.prop.getProperty("USER_CIBLE"),
    											Lanceur.prop.getProperty("PASSWORD_CIBLE"),
    											Lanceur.prop.getProperty("URL_ORACLE_CIBLE"));
     
    									String insertWithBlob = ligneInsertion.toString().replace("EMPTY_BLOB()", " ? ");
    									insertWithBlob = insertWithBlob.replace(" VALUES", " ("+sbColonnes.toString()+") VALUES");
    									insertWithBlob = insertWithBlob.replace(table.getNom(), connexionCibleBlob.getOraclesource().getUser()+"."+table.getNom());
     
    									PreparedStatement pstmt = connexionCibleBlob
    											.createStatement(insertWithBlob);
    									pstmt.setBlob(1, blob);
    									pstmt.executeUpdate();
    									pstmt.close();
    									logger.log(Level.INFO,
    											"\t\t[FIN] Traitement blob");
    									connexionCibleBlob.fermer();
    J'ai d'abord pensé que ça pouvais venir du fait que pour certaines lignes, la valeur de la colonne blob est vide.

    Ce problème ne se produit pas si je modifie le code comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    									String insertWithBlob = ligneInsertion.toString().replace("EMPTY_BLOB()", " NULL ");
    									insertWithBlob = insertWithBlob.replace(" VALUES", " ("+sbColonnes.toString()+") VALUES");
    									insertWithBlob = insertWithBlob.replace(table.getNom(), connexionCibleBlob.getOraclesource().getUser()+"."+table.getNom());
     
    									PreparedStatement pstmt = connexionCibleBlob
    											.createStatement(insertWithBlob);
    									//pstmt.setBlob(1, blob);
    									pstmt.executeUpdate();
    									pstmt.close();
    									logger.log(Level.INFO,
    											"\t\t[FIN] Traitement blob");
    									connexionCibleBlob.fermer();

    le problème viendrait donc des paramètres de notre statement, mais pourquoi, grand question :o
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Points : 238
    Points
    238
    Par défaut
    SOLUTION:

    remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pstmt.setBlob(1, blob);
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pstmt.setBinaryStream(1, blob.getBinaryStream(), (int) blob.length());
    je sais pas pourquoi mais bon ...
    L'intelligence c'est comme la confiture, moins tu en as , plus tu l'étales...

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

Discussions similaires

  1. [Conception] Insertion de paramètres à l'infini
    Par sousou_ dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 19/08/2006, 12h05
  2. Plantage aléatoire à l'ouv. de fichiers ext.
    Par Stutak dans le forum Access
    Réponses: 3
    Dernier message: 09/08/2006, 19h36
  3. Réponses: 10
    Dernier message: 21/04/2006, 18h23
  4. [Oracle] Insertion d'un blob en passant par une procédure stockée
    Par choubiroute dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/03/2006, 18h34
  5. Réponses: 15
    Dernier message: 07/07/2005, 11h05

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