1

私は次の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();

VARCHARパラメータタイプがではなく、であると見なされるため、setBinaryStreamは失敗しますBLOB。実際、この関数org.hsqldb.jdbc.JDBCPreparedStatement.setBinStreamには次のステートメントがあります。

    if (parameterTypes[parameterIndex - 1].typeCode == Types.SQL_BLOB) {
        setBlobParameter(parameterIndex, x, length);

        return;
    }

3のparameterIndex場合、ifステートメントを入力して。を呼び出す必要がありsetBlobParameterます。しかし、何らかの理由で、typeCodeに対応する12を返します。これはVARCHAR、ifステートメントがスキップされ、最終的に、変換中org.hsqldb.HsqlExceptionの互換性のないデータ型のメッセージで発生します。

私は何が間違っているのですか?

4

1 に答える 1

1

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)
于 2013-03-02T13:02:56.150 に答える