2013-04-23 2 views
2

Я пытаюсь вставить изображение в базу данных, но получаю следующее:Java - Сохранение изображения в качестве Blob в JavaDB

java.sql.SQLDataException: Была сделана попытка получить значение данных типа «BLOB» из значения данных типа «java.io.InputStream (ASCII)».

Я использую blob в базе данных.

Вот как я делаю вставки:

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); 
     } 

    } 
} 

Кстати, о хранении путь только изображения, проблема в том, что я хочу, чтобы пользователи могли выслать изображения и магазин их в файле, и я не уверен, как точно решить проблему с несколькими изображениями с тем же именем, переименование будет хорошим и простым решением?

+1

Убедитесь, что индекс 5 относится к правильному параметру. Они 1 проиндексированы! Кроме того, 'available()' возвращает только оценку! – jn1kk

+0

Я уверен в индексе –

+1

«переименование будет хорошим и простым решением?» Вы должны хранить изображения с помощью собственной схемы именования и хранить в БД «Исходное имя» вместе с указателем на файл. – leonbloy

ответ

0

Попробуйте это:

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

EDIT --- EDIT

Попробуйте это:

Я думаю, ваша проблема в том, что вы не распространяющиеся изменения.

Позвонить acceptChanges() после каждой команды.

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

по-прежнему та же проблема –

+0

@AbdulRahimHaddad показать больше кода. – jn1kk

+0

добавлено еще код –