Java—在JavaDB中将图像存储为Blob
我试图将图像插入数据库,但得到以下结果: java.sql.SQLDataException:试图从“java.io.InputStream(ASCII)”类型的数据值中获取“BLOB”类型的数据值 我在数据库中使用blob 以下是我如何进行插入:Java—在JavaDB中将图像存储为Blob,java,image,jdbc,blob,javadb,Java,Image,Jdbc,Blob,Javadb,我试图将图像插入数据库,但得到以下结果: java.sql.SQLDataException:试图从“java.io.InputStream(ASCII)”类型的数据值中获取“BLOB”类型的数据值 我在数据库中使用blob 以下是我如何进行插入: package javaapplication16; import com.sun.rowset.CachedRowSetImpl; import java.io.File; import java.io.FileInputStream; impor
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);
}
}
}
顺便说一句,关于仅存储图像路径,问题是我希望用户能够向我发送图像并将其存储在文件中,我不确定如何准确地解决具有相同名称的多个图像的问题,重命名是否是一个好且简单的解决方案?尝试以下方法:
File f = new File(imagePath);
FileInputStream fin = new FileInputStream(f);
crs.setBinaryStream(5, fin, (int) f.length());
编辑---编辑
试试这个:
File f = new File(imagePath);
FileInputStream fin = new FileInputStream(f);
crs.setBinaryStream(5, fin, (int) f.length());
我认为你的问题在于你没有传播变化
在每个命令后调用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();
确保索引5引用了正确的参数。他们有1个索引!另外,
available()
只返回一个估计值!我确信索引“重命名是一个好的简单的解决方案吗?”你应该用你自己的命名方案存储图像,并将“原始名称”和指向文件的指针一起存储在数据库中。添加了你提到的。获取了行crs.acceptChanges()的此异常;在com.sun.rowset.internal.CachedRowSetWriter.initSQLStatements(CachedRowSetWriter.java:1064)的com.sun.rowset.internal.CachedRowSetWriter.writeData(CachedRowSetWriter.java:300)的com.sun.rowset.CachedRowSetImpl.acceptChanges(CachedRowSetImpl.java:880)的线程“main”java.lang.NullPointerException中创建表后完成在javaapplication16.javaapplication16.main(javaapplication16.java:41)中,java结果:1