2013-03-01 2 views
0

У меня есть следующий HSQLDB схема (по данным SQLWorkbench):Неспособность вставить двоичный поток в BLOB в hsqldb?

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 следует ввести Условный оператор и вызовут 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

Смежные вопросы