1

我有以下 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;
    }

对于parameterIndex3,它应该输入 if 语句并调用setBlobParameter. 但是,由于某种原因,typeCode返回 12,对应于VARCHAR,跳过 if 语句,最后引发 an并在转换中显示不兼容数据类型org.hsqldb.HsqlException的消息。

我究竟做错了什么?

4

1 回答 1

1

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)
于 2013-03-02T13:02:56.150 回答