编辑:好吧,我有点“解决了”它,我将图像对象存储为其他类型(可序列化)在我的hsqldb中,我不会将其标记为“已解决”,因为原始问题仍然存在,但是这“解决了”我的问题,因为我现在可以存储我的图像并检索它们了,如果有人知道我犯错了__ **,请给我以启发。

(这真是令人头疼,不列颠哥伦比亚省我仍然认为我没有做错任何事情,所以,如果您知道分享信息,请,-))

先感谢您!


我目前正在尝试使用以下代码将图像插入到hsqldb中:

String sql = "INSERT INTO IMAGE VALUES(NULL, ?, ?);";
        BlobInputStream bis = new BlobInputStream(i.getData());
    int x = 0;
    try {
        PreparedStatement pS = c.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
        pS.setBlob(1, bis);
        pS.setString(2, i.getAlt_text());
        pS.executeUpdate();
        ResultSet set = pS.getGeneratedKeys();
        set.next();
        x = set.getInt("ID");
        set.close();
        c.commit();
        return x;
    } catch (SQLException e) {
        throw new DataBackendException(e);
    }

BlobInputStream是我编写的一个简单类,符合iface的输入流

    private class BlobInputStream extends InputStream {
    private final byte[] data;
    private int pos = -1;
    public BlobInputStream(byte[] data) {
        this.data=data;
    }
    @Override
    public int read() throws IOException {
        pos++;
        if(!(pos<data.length)) return -1;
        return (int)data[pos];
    }

}

一切正常,我一直在使用以下代码进行测试:

@Test
public void testImageStoreRecoverDelete() throws DataBackendException {




    byte[] oneMeg = new byte[152655];

    for(int i=0;i<oneMeg.length;i++) {
        oneMeg[i] = (byte)13;
    }


    Image i = new Image();
    i.setId(0);
    i.setData(oneMeg);
    i.setAlt_text("HEYHEYHEY");

    int id = layer.saveImage(i);
    i.setId(id);

    Image i2 = layer.getImage(id);


    assertEquals(i, i2);

    layer.deleteImage(id);

    Image i3 = layer.getImage(id);

    assertNull(i3);

}

(equals方法是为Image对象实现的)我用来检索图像的代码如下:

    @Override
public Image getImage(int id) throws DataBackendException {
    String sql = "SELECT * FROM IMAGE WHERE id="+id;

    try {
        ResultSet set = c.prepareCall(sql).executeQuery();
        if(!set.next()) return null;
        Image i = new Image();
        i.setId(set.getInt("ID"));
        i.setAlt_text(set.getString("ALTTEXT"));
        Blob b = set.getBlob("DATA");           
        i.setData(IOUtils.toByteArray(b.getBinaryStream()));
        set.close();
        b.free();
        return i;
    } catch (Exception e) {
        throw new DataBackendException(e);
    }
}

(IOUtils来自apache commons-io)

但这是问题所在:当我直接从驱动器读取图像并将其保存时,blob总是以0字节的长度返回:

    public static void main(String[] args) throws Exception {
    FileInputStream iS = new FileInputStream(new File("/home/ubuser/Downloads/clouds.jpg"));
    byte[] data = IOUtils.toByteArray(iS);//read(iS);
    Image i = new Image();
    i.setData(data);

    ServiceLayer layer = DataBackendManager.getDataBackend().getServiceLayer();
    int id = layer.saveImage(i);
    print("id: "+id);
    Image i2 = layer.getImage(id);

    print("data: "+i2.getData());
    print("length: "+i2.getData().length);

    FileOutputStream stream = new FileOutputStream("/home/ubuser/Desktop/test.jpg");
    stream.write(i2.getData());
    stream.flush();
    stream.close();
}

输出:id:1数据:[B @ a39ab89长度:0

哦,我的BLOB定义为:

创建表图像(由ID作为默认身份生成的ID整数(从1开始,由1递增)不为空,DATA BLOB(4M)不为空,ALTTEXT VARCHAR(35),约束IID主键(ID));

任何帮助将非常感激 :-)

  ask by Hut translate from so

本文未有回复,本站智能推荐:

3回复

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

我正在尝试在HSQLDB中将图像添加为BLOB。 但是在表中,我发现类似“:hsqll:jdbc:client @ f3t5h”的内容。 下面的Java代码有什么问题吗? 我的检索代码通常是针对其他数据库的。 为什么它不适用于HSQLDB? 那是我的插入代码。 ima
1回复

无法使用jdbc java连接到hsqldb

我在Java应用程序中使用jdbc连接到hsqldb时遇到问题。 在将主类从json解析为java后,我在列表中获得了3个对象,这些对象正试图保存到数据库中。 这是道课 这是我尝试将对象事件保存到数据库时的主要对象(列表中有3个对象) 调试后,我发现该连接为空。 有什么
1回复

错误:用户缺少未找到HSQLDB的权限或对象

您好我正在使用HSQLDB并使用属性ID创建了一个表EMPLOYEE 。 db是一个独立的db,这是它的脚本文件: 我使用这个java类来访问db: 它只是一个测试类...... 在这里,我从一个jsp文件中调用该函数: 有一个解决方案吗? 在过去这个错误发生了
1回复

如何使用JDBC工具访问hsqldb数据库?

我有一个hsqldb文件数据库。 因此,文件夹包含: 当我打开脚本时,可以看到存在SQL表和INSERT。 如何使用squirrel等JDBC工具来检查像真实数据库一样的表? 我在使用该数据库的应用程序运行时尝试使用jdbc:hsqldb:file:C:\\path\\to\\
1回复

HSQLDB重设加密数据库的密码

是否可以为加密和嵌入式hsqldb数据库重设密码? 我可以打开它,建立连接,但是我想删除密码,尝试了一下 没用。 甚至支持吗? PS。 加密密钥作为 ; crypt_key =“ 16def4bd3310e999f1a8d8d369986ab9”; crypt_
1回复

如何以独立模式获取使用hsqldb runserver创建的所有表

我在stanlone模式下成功为hsqldb创建了jdbc连接。我找到了创建新数据库的位置。使用runserver中新创建的数据库的路径创建了一些表。但是当我尝试使用jdbc连接获取这些表时,我可以没有得到那些表。 连接URL为:“ jdbc:hsqldb:file:databasename;
1回复

使用Blob从数据库获取文件

我正在使用Oracle Express Edition和JDBC进行数据库项目。 我正在使用的数据库中有一个excel电子表格(正在编辑,更新等),我最近开始阅读有关BLOBS的信息,所以我对它的含义只有一个大致的了解,但我想知道是否有可能在我的项目中使用BLOB库,以便下载更新的电子表格并将
1回复

从Java将Blob存储到mysql 5.7.16时发生奇怪的异常

我需要有关将文件存储到mysql数据库到blob字段中的无法理解的问题的帮助: 我有一个功能 它在hslqdb和postgres数据库上非常出色。 但是当我尝试使用mysql 5.7时出现点错误: 我花了很多时间去理解问题,但是在代码中看不到任何问题。 可能的mysql
2回复

从spring使用HSQLDB时的Blob大小限制

我正在使用HSQLDB进行测试。 通过扫描模型从Spring创建数据库。 其中一个模型是包含附件的消息(因此产生了一个高架)。 尝试使用附件保存消息时,会导致:org.hsqldb.HsqlException:数据异常:字符串数据,右截断。 附件最大只有4kb。 有没有办法从sprin
2回复

为什么在读取数据库hsqldb中的blob时抛出java.lang.IndexOutOfBoundsException

你好。 我正在使用以下代码在服务器端将blob写入数据库。 为了读取blob,使用了以下代码: Blob包含下一个要测试的文本: 我已经在oracle和postresql上成功测试过,但是在hsqldb上测试失败,但出现以下异常: 调试器可以看到blob.get