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
與消息中的轉換爲不兼容數據類型。
我在做什麼錯?
謝謝,我認爲它知道將字段的名稱映射到架構中各個字段的定義。 – mark 2013-03-02 14:08:51