2013-03-01 42 views
0

我有以下HSQLDB模式(由SQLWorkbench报道):无法将二进制流插入到hsqldb中的BLOB中?

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; 

接下来,我尝试使用下面的准备语句文件插入数据字段:

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

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) 
+0

谢谢,我认为它知道将字段的名称映射到架构中各个字段的定义。 – mark 2013-03-02 14:08:51

相关问题