我有以下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
,消息为不兼容的数据输入转换。
我做错了什么?
答案 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)