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 :

fichier de taille > 0 mais Blob de taille zéro en base Oracle


Sujet :

JDBC Java

  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 385
    Points
    1 385
    Par défaut fichier de taille > 0 mais Blob de taille zéro en base Oracle
    Je dois enregister un document MSword dans une base Oracle (champ CASU_DOC_WORD de type Blob). J'obtient un Blob de taille zéro (info fournie par Toad) alors que ma trace me donne :
    enregDocWord - Enregistrement docWord = java.io.FileInputStream@f8395f / fichierWord.length() = 68608
    Ce que j'envoie à la base semble donc ne pas être vide, mais ce qui est stocké oui !? Le nom du document enregistré en même temps est bon.
    J'ai repris le code trouvé ici : http://java.developpez.com/faq/jdbc/?page=types#blob
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    FileInputStream docWord = new FileInputStream(fichierWord);
    con = Pool.getInstance().getConnection();
    query = new StringBuffer("");
    query.append("UPDATE CASU_CASU SET CASU_DOC_WORD_NOM = ?, CASU_DOC_WORD = ? ");
    query.append("WHERE CASU_IDY = ? ");
    pstmt = con.prepareStatement(query.toString());
     
    log.debug("enregDocWord - Enregistrement docWord = " + docWord + " / fichierWord.length() = " + fichierWord.length());
     
    pstmt.setString(1, nomDocWord);
    pstmt.setBinaryStream(2, docWord, (int) fichierWord.length());
    pstmt.setInt(3, idCasu);
    pstmt.executeUpdate();

  2. #2
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 58
    Points : 73
    Points
    73
    Par défaut
    Et si tu fais un commit, le fichier vaut toujours 0 ? Je me rappelle que dans Oracle, l'écriture sur le disque n'est pas effectué systématiquement (pour des soucis de performance).

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 385
    Points
    1 385
    Par défaut
    Le commit se fait automatiquement avec le update.
    Il me semble que je ne verrais pas le nouveau nom de fichier avec Toad si le commit n'est pas effectué.
    J'ai essayé en mettant autocommit à faux et le faisant après le update mais ça n'a rien changé.

    Je me demande si ce n'est pas docWord qui est vide. Il y a moyen de vérifier sa taille ? Je n'ai pas trouvé de méthode length ou size.

  4. #4
    Membre expérimenté

    Homme Profil pro
    Senior Développeur JEE
    Inscrit en
    Avril 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Senior Développeur JEE
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2002
    Messages : 795
    Points : 1 660
    Points
    1 660
    Par défaut
    Tout ce que tu peux vérifier c'est la taille du blob.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     DBMS_LOB.getlength(le_nom_de_ta_colonne)
    Voilà

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 385
    Points
    1 385
    Par défaut
    Citation Envoyé par Stessy
    Tout ce que tu peux vérifier c'est la taille du blob.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     DBMS_LOB.getlength(le_nom_de_ta_colonne)
    Voilà
    Il est bien vide.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Points : 1 385
    Points
    1 385
    Par défaut
    Il semblerait qu'il faille utiliser le oracle.sql.BLOB dans du code semblable à celui-ci :
    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
    public static void setBlob(Connection connection, InputStream inputStream, int idCasu) throws SQLException, IOException {
    	Statement statement = connection.createStatement();
    	ResultSet resultSet = statement.executeQuery("SELECT CASU_IDY, CASU_DOC_WORD FROM CASU_CASU WHERE CASU_IDY = " + idCasu + " FOR UPDATE");
    	resultSet.next();
    	oracle.sql.BLOB blobDest = (oracle.sql.BLOB) ((OracleResultSet) resultSet).getBlob("CASU_DOC_WORD");
    	byte[] buffer = new byte[blobDest.getBufferSize()];
    	OutputStream outputStream = blobDest.getBinaryOutputStream();
    	int length = -1;
    	while ((length = inputStream.read(buffer)) != -1) {
    		outputStream.write(buffer, 0, length);
    		outputStream.flush();
    	}
    	statement.close();
    	outputStream.close();
    	inputStream.close();
    	resultSet.close();
    }
    J'ai des problèmes de cast sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oracle.sql.BLOB blobDest = (oracle.sql.BLOB) ((OracleResultSet) resultSet).getBlob("CASU_DOC_WORD");
    J'ai donc essayé de me connecter directement à Oracle via une jsp de test :
    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
    <%try {
    javax.naming.InitialContext ctx = new javax.naming.InitialContext();%>
    Contexte JNDI : <%=ctx%><br>
    <% oracle.jdbc.pool.OracleDataSource ds =
      (oracle.jdbc.pool.OracleDataSource)ctx.lookup(fr.cg92.soucvs.config.MainConfig.ORACLEJNDI); %>
    DataSource : <%=ds%><br>
    <% oracle.jdbc.driver.OracleConnection connection = (oracle.jdbc.driver.OracleConnection)ds.getConnection(); %>
    Connexion : <%=connection%><br>
    <%
    connection.close();
    } catch (Exception e) {
    %>
    <hr>Erreur : <%=e%>
    <hr>
    <%
    e.printStackTrace(new java.io.PrintWriter(out));
    }
    %>
    J'ai l'erreur suivante :
    javax.naming.NamingException: Cannot create resource instance
    at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:142)
    at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:792)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:139)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:780)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:139)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:780)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:152)
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:136)
    at javax.naming.InitialContext.lookup(Unknown Source)
    at org.apache.jsp.jsp.test.test_005fdb_jsp._jspService(test_005fdb_jsp.java:54)
    test_005fdb_jsp.java:54 correspond à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (oracle.jdbc.pool.OracleDataSource)ctx.lookup(fr.cg92.soucvs.config.MainConfig.ORACLEJNDI);
    Sur le Web, ceux qui ont le même message d'erreur l'ont résolu en ajoutant des jar dans le comon/lib de Tomcat ou en passant de Tomcat 5.5 à Tomcat 5.0. Ca ne marche pas pour moi.

Discussions similaires

  1. [Oracle] Enregistrer fichier dans un champs de type BLOB
    Par madevilts dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 16/01/2008, 08h46
  2. Réponses: 1
    Dernier message: 07/09/2007, 12h15
  3. Réponses: 4
    Dernier message: 11/11/2006, 19h50
  4. Réponses: 1
    Dernier message: 29/08/2006, 21h45
  5. Réponses: 4
    Dernier message: 06/07/2006, 20h36

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