У меня есть следующий 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
поднят с сообщением несовместимых данных в конверсии.
Что я делаю неправильно?
Спасибо, я думал, что он знал, чтобы сопоставить имена полей с определениями соответствующих полей в схеме. – mark