繁体   English   中英

在HSQLDB中将图像添加为BLOB,但类似“:hsqll:jdbc:client @ f3t5h”的操作最终在表中显示

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM