无法将二进制流插入hsqldb中的BLOB?

时间:2013-03-01 23:29:54

标签: hsqldb

我有以下hsqldb架构(由SQLWorkbench报告):

DROP TABLE TEST CASCADE;
CREATE TABLE TEST
(
   NAME      VARCHAR(256),
   METADATA  VARCHAR(2048),
   DATA      BLOB
);

GRANT TRIGGER, INSERT, REFERENCES, DELETE, SELECT, UPDATE ON TEST TO DBA;

接下来,我尝试使用以下预准备语句将文件插入DATA字段:

MERGE INTO test  USING (VALUES ?, ?, ?) I (name, metadata, data)  ON (test.name=I.name)  WHEN MATCHED THEN UPDATE SET test.data = I.data, test.metadata = I.metadata  WHEN NOT MATCHED THEN INSERT (name, metadata, data) VALUES (I.name, I.metadata, I.data)

以下是代码:

String name = ...;
String metadata = ...;
InputStream data = ...;
JDBCDataSource ds = new JDBCDataSource();
ds.setDatabase("jdbc:hsqldb:file:c:/tmp/file.db");
ds.setUser("sa");
ds.setPassword("");
PreparedStatement set = ds.getConnection().prepareStatement(m_setSql);
set.setString(1, name);
set.setString(2, metadata);
set.setBinaryStream(3, data);
set.executeUpdate();

setBinaryStream失败,因为参数类型被认为是VARCHAR,而不是BLOB。实际上,函数org.hsqldb.jdbc.JDBCPreparedStatement.setBinStream具有以下声明:

    if (parameterTypes[parameterIndex - 1].typeCode == Types.SQL_BLOB) {
        setBlobParameter(parameterIndex, x, length);

        return;
    }

对于parameterIndex 3,它应该输入if语句并调用setBlobParameter。但是,出于某种原因,typeCode返回12,对应于VARCHAR,if语句被跳过,最后引发org.hsqldb.HsqlException,消息为不兼容的数据输入转换

我做错了什么?

1 个答案:

答案 0 :(得分:0)

MERGE语句中的参数值类型未知,默认为VARCHAR。您需要将BLOB参数强制转换为BLOB。

MERGE INTO test  USING (VALUES ?, ?, CAST(? AS BLOB)) I (name, metadata, data)  
ON (test.name=I.name)  
WHEN MATCHED THEN UPDATE SET test.data = I.data, test.metadata = I.metadata
WHEN NOT MATCHED THEN INSERT (name, metadata, data) VALUES (I.name, I.metadata, I.data)