[英]Adding image as BLOB in HSQLDB but something like “:hsqll:jdbc:client@f3t5h” ends up in the table
我正在尝试在HSQLDB中将图像添加为BLOB。 但是在表中,我发现类似“:hsqll:jdbc:client @ f3t5h”的内容。 下面的Java代码有什么问题吗?
我的检索代码通常是针对其他数据库的。 为什么它不适用于HSQLDB?
Statement stmt = conn.createStatement();
ResultSet results =stmt.executeQuery("SELECT * from productdetails");
while (results.next()) {
String code = (String) results.getObject(1);
String name = (String) results.getObjeenter code herect(2);
String price = Double.toString((Double) results.getObject(3));
int quantity = (Integer) results.getObject(4);
Boolean featured = (Boolean) results.getObject(5);
String desc = (String) results.getObject(6);
String imgPath = (String) results.getObject(7);
Blob aBlob = (Blob) results.getBlob(10);
byte[] allBytesInBlob = aBlob.getBytes(1, (int) aBlob.length());
try {
FileOutputStream fis =
(FileOutputStream) getOutputStream(allBytesInBlob);
} catch (IOException ex) {
Logger.getLogger(Helper.class.getName()).log(Level.SEVERE, null, ex);
}
}
public OutputStream getOutputStream(byte[] _data) throws IOException
{
OutputStream out = new ByteArrayOutputStream();
out.write(_data);
return out;
}
那是我的插入代码。
Connection conn = db.getConnection();
PreparedStatement pstmt;
String sql = "INSERT INTO PRODUCTDETAILS"
( PRODUCTCODE, NAME, PRICE, QUANTITY, FEATURED, DESCRPTION, IMAGEPATH,IMAGE )
VALUES ( ?, ?,? ,? ,? , ?, ?,?)";
pstmt = conn.prepareStatement(sql);
FileInputStream fis;
File image = new File(values.getImgPath());
fis = new FileInputStream(image);
pstmt.setBinaryStream(8, (InputStream) fis, (int) (image.length()));
pstmt.execute();
image
列显然是BLOB
类型。
您的Java代码对于HSQLDB 2.2.x是正确的。 斑点似乎已插入。 您用来检索Blob的代码似乎不正确。 您尚未报告此代码,但是显然您没有使用java.sql.Blob方法访问返回的Blob(org.hsqldb.jdbcJDBCBLOBClient对象)。 发布检索代码以进行更正。
如果您在HSQLDB DatabaseManager或某些其他工具中查看表数据,则它可能会将blob显示为对象的地址,而不是显示二进制内容。
您调用aBlob.getBytes(10, aBlob.length())
。
但是, Blob.getBytes()
的第一个参数是要检索的第一个字节的索引(从1开始,因为JDBC中的所有索引都是)。 因此,您将忽略 (即未获取) Blob
的前9个字节。 改为传入1
。
如果输出实际上是您所显示的,那么其他地方也有问题(可能是您插入Blob
的方式),但这当然是您应该解决的第一个问题。
Joachim:10是列索引,而不是byte [index]。
您得到的是标准的Object.toString()。 “图像列显然是BLOB类型。” 是的,在分贝中 你的桌子怎么样? 您的模型为此列返回通用String.class吗? 如果是这样,则应检查对象本身,数据是否在内部(对象不在乎是母亲的低图片还是低文字)。 很好的将byteoutputstream强制转换为fileoutputstream,在我的Java中不起作用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.