2013-04-23 4 views
2

J'essaie d'insérer une image dans une base de données, mais obtenir ce qui suit:Java - Stockage image en tant que Blob dans JavaDB

java.sql.SQLDataException: Une tentative a été faite pour obtenir une valeur de données de type 'BLOB' à partir d'une valeur de données de type 'java.io.InputStream (ASCII)'.

J'utilise blob dans la base de données.

Voici comment je fais l'insertion:

package javaapplication16; 
import com.sun.rowset.CachedRowSetImpl; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.sql.SQLException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.sql.rowset.CachedRowSet; 

public class JavaApplication16 { 

    public static void main(String[] args) throws FileNotFoundException { 
     try { 
      String driver = "org.apache.derby.jdbc.EmbeddedDriver"; 
      try { 
       try { 
        Class.forName(driver).newInstance(); 
       } catch (InstantiationException ex) { 
        Logger.getLogger(JavaApplication16.class.getName()).log(Level.SEVERE, null, ex); 
       } catch (IllegalAccessException ex) { 
        Logger.getLogger(JavaApplication16.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } catch (ClassNotFoundException ex) { 
       Logger.getLogger(JavaApplication16.class.getName()).log(Level.SEVERE, null, ex); 
      } 

      CachedRowSet crs = null; 
      crs = new CachedRowSetImpl(); 
      crs.setUrl("jdbc:derby:derbyDB; create = true"); 
      crs.setUsername("x"); 
      crs.setPassword("x"); 
      crs.setCommand("drop table tbl"); 
      crs.execute(); 
      crs.setCommand("CREATE TABLE tbl (ID blob)"); 
      crs.execute(); 
      File f = new File("/images/exam_gif_to_png.gif"); 
      crs.setCommand("insert into tbl (id) values (?)"); 
      FileInputStream fin = new FileInputStream(f); 
      crs.setBinaryStream(1, fin, (int) f.length()); 
      crs.execute(); 
     } catch (SQLException ex) { 
      Logger.getLogger(JavaApplication16.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 
} 

Par ailleurs, sur le stockage du chemin de l'image que, le problème est que je veux que les utilisateurs soient en mesure de me faire parvenir des images et des magasins les dans un fichier, et je ne sais pas exactement comment résoudre le problème d'avoir plusieurs images avec le même nom, renommez-vous être une bonne solution simple?

+1

Assurez-vous que l'index 5 fait référence au bon paramètre. Ils sont 1 indexés! De plus, 'available()' renvoie seulement une estimation! – jn1kk

+0

Je suis sûr que l'index –

+1

"sera renommé être une solution bonne et simple?" Vous devriez stocker les images avec votre propre schéma de nommage, et stocker dans le DB le "nom d'origine" avec le pointeur vers le fichier. – leonbloy

Répondre

0

Essayez ceci:

File f = new File(imagePath); 
FileInputStream fin = new FileInputStream(f); 
crs.setBinaryStream(5, fin, (int) f.length()); 

EDIT --- EDIT

Essayez ceci:

Je pense que votre problème est que vous n'êtes pas propagez changements.

Appelez acceptChanges() après chaque commande.

crs.setCommand("drop table tbl"); 
crs.execute(); 
crs.acceptChanges(); 

crs.setCommand("CREATE TABLE tbl (ID blob)"); 
crs.execute(); 
crs.acceptChanges(); 

crs.setBinaryStream(1, fin, (int) f.length()); 
crs.execute(); 
crs.acceptChanges(); 
+0

toujours le même problème –

+0

@AbdulRahimHaddad afficher plus de code. – jn1kk

+0

ajouté plus de code –

Questions connexes