Jdbc 如何将字节数组插入Informix blob

Jdbc 如何将字节数组插入Informix blob,jdbc,informix,Jdbc,Informix,如何将大字节数组插入Informix blob列?现在我有一个疑问: INSERT INTO TABLE (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN_BLOB) VALUES(?, ?, ?, ?, ?) 这引发了一个非常奇怪的异常: org.sqlproc.engine.SqlProcessorException: SQL ' INSERT INTO TABLE (COLUMN1, COLUMN2, COLUMN3, COLUMN4, C

如何将大字节数组插入Informix blob列?现在我有一个疑问:

INSERT INTO TABLE (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN_BLOB)
    VALUES(?, ?, ?, ?, ?)
这引发了一个非常奇怪的异常:

org.sqlproc.engine.SqlProcessorException: SQL '  INSERT INTO TABLE (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLOMN_BLOB   )   VALUES(?, ?, ?, ?, ?)'. org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar []; nested exception is java.sql.SQLException: The specified table (into) is not in the database.
Caused by: java.sql.SQLException: The specified table (into) is not in the database.
    at com.informix.jdbc.IfxSqli.a(IfxSqli.java:3545)
    at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3871)
    at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2661)
    at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.java:2577)
    at com.informix.jdbc.IfxSqli.executeFastPath(IfxSqli.java:5981)
    at com.informix.jdbc.IfxSqli.executeFastPath(IfxSqli.java:5892)
    at com.informix.jdbc.IfxSmartBlob.IfxLoColInfo(IfxSmartBlob.java:306)
    at com.informix.jdbc.IfxSmBlob.i(IfxSmBlob.java:787)
    at com.informix.jdbc.IfxSmBlob.a(IfxSmBlob.java:520)
    at com.informix.jdbc.IfxResultSet.b(IfxResultSet.java:291)
    at com.informix.jdbc.IfxStatement.c(IfxStatement.java:1275)
    at com.informix.jdbc.IfxPreparedStatement.executeUpdate(IfxPreparedStatement.java:418)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.sqlproc.engine.spring.SpringQuery$9.doInPreparedStatement(SpringQuery.java:454)
    at org.sqlproc.engine.spring.SpringQuery$9.doInPreparedStatement(SpringQuery.java:448)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587)
    ... 44 more
Caused by: java.sql.SQLException: ISAM error: no record found.
    at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:412)
    at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3876)
    ... 59 more
Caused by: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL []; SQL state [IX000]; error code [-9810]; Smart-large-object error.; nested exception is java.sql.SQLException: Smart-large-object error.
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:603)
    at org.sqlproc.engine.spring.SpringQuery.updateWithoutGenKeys(SpringQuery.java:448)
    at org.sqlproc.engine.spring.SpringQuery.update(SpringQuery.java:293)
    ... 42 more
Caused by: java.sql.SQLException: Smart-large-object error.
    at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:412)
    at com.informix.jdbc.IfxSqli.a(IfxSqli.java:3549)
    at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3871)
    at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2661)
    at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.java:2577)
    at com.informix.jdbc.IfxSqli.executeFastPath(IfxSqli.java:5981)
    at com.informix.jdbc.IfxSqli.executeFastPath(IfxSqli.java:5892)
    at com.informix.jdbc.IfxSmartBlob.IfxLoCreate(IfxSmartBlob.java:376)
    at com.informix.jdbc.IfxSmBlob.i(IfxSmBlob.java:790)
    at com.informix.jdbc.IfxSmBlob.a(IfxSmBlob.java:520)
    at com.informix.jdbc.IfxResultSet.b(IfxResultSet.java:291)
    at com.informix.jdbc.IfxStatement.c(IfxStatement.java:1275)
    at com.informix.jdbc.IfxPreparedStatement.executeUpdate(IfxPreparedStatement.java:418)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.sqlproc.engine.spring.SpringQuery$9.doInPreparedStatement(SpringQuery.java:454)
    at org.sqlproc.engine.spring.SpringQuery$9.doInPreparedStatement(SpringQuery.java:448)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587)
    ... 44 more
Caused by: java.sql.SQLException: Smart Large Objects: No sbspace number specified.
    at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:412)
    at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3876)
    ... 59 more
我正在使用,它使用准备好的语句将blob插入表中:

@Override
public void set(PreparedStatement st, int index, Object value) throws SQLException {
    byte[] bytes = (byte[]) value;
    st.setBytes(index, bytes);
}
DDL:

Informix服务器是运行在AIX7.1上的Informix 12.10

更新

好的,我解决第一个问题。sql从空间开始,这对于informix来说是个问题。但现在我有另一个例外:

org.sqlproc.engine.SqlProcessorException: SQL '  INSERT INTO TABLE (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLOMN_BLOB   )   VALUES(?, ?, ?, ?, ?)'. org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar []; nested exception is java.sql.SQLException: The specified table (into) is not in the database.
Caused by: java.sql.SQLException: The specified table (into) is not in the database.
    at com.informix.jdbc.IfxSqli.a(IfxSqli.java:3545)
    at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3871)
    at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2661)
    at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.java:2577)
    at com.informix.jdbc.IfxSqli.executeFastPath(IfxSqli.java:5981)
    at com.informix.jdbc.IfxSqli.executeFastPath(IfxSqli.java:5892)
    at com.informix.jdbc.IfxSmartBlob.IfxLoColInfo(IfxSmartBlob.java:306)
    at com.informix.jdbc.IfxSmBlob.i(IfxSmBlob.java:787)
    at com.informix.jdbc.IfxSmBlob.a(IfxSmBlob.java:520)
    at com.informix.jdbc.IfxResultSet.b(IfxResultSet.java:291)
    at com.informix.jdbc.IfxStatement.c(IfxStatement.java:1275)
    at com.informix.jdbc.IfxPreparedStatement.executeUpdate(IfxPreparedStatement.java:418)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.sqlproc.engine.spring.SpringQuery$9.doInPreparedStatement(SpringQuery.java:454)
    at org.sqlproc.engine.spring.SpringQuery$9.doInPreparedStatement(SpringQuery.java:448)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587)
    ... 44 more
Caused by: java.sql.SQLException: ISAM error: no record found.
    at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:412)
    at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3876)
    ... 59 more
Caused by: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL []; SQL state [IX000]; error code [-9810]; Smart-large-object error.; nested exception is java.sql.SQLException: Smart-large-object error.
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:603)
    at org.sqlproc.engine.spring.SpringQuery.updateWithoutGenKeys(SpringQuery.java:448)
    at org.sqlproc.engine.spring.SpringQuery.update(SpringQuery.java:293)
    ... 42 more
Caused by: java.sql.SQLException: Smart-large-object error.
    at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:412)
    at com.informix.jdbc.IfxSqli.a(IfxSqli.java:3549)
    at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3871)
    at com.informix.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2661)
    at com.informix.jdbc.IfxSqli.receiveMessage(IfxSqli.java:2577)
    at com.informix.jdbc.IfxSqli.executeFastPath(IfxSqli.java:5981)
    at com.informix.jdbc.IfxSqli.executeFastPath(IfxSqli.java:5892)
    at com.informix.jdbc.IfxSmartBlob.IfxLoCreate(IfxSmartBlob.java:376)
    at com.informix.jdbc.IfxSmBlob.i(IfxSmBlob.java:790)
    at com.informix.jdbc.IfxSmBlob.a(IfxSmBlob.java:520)
    at com.informix.jdbc.IfxResultSet.b(IfxResultSet.java:291)
    at com.informix.jdbc.IfxStatement.c(IfxStatement.java:1275)
    at com.informix.jdbc.IfxPreparedStatement.executeUpdate(IfxPreparedStatement.java:418)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
    at org.sqlproc.engine.spring.SpringQuery$9.doInPreparedStatement(SpringQuery.java:454)
    at org.sqlproc.engine.spring.SpringQuery$9.doInPreparedStatement(SpringQuery.java:448)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587)
    ... 44 more
Caused by: java.sql.SQLException: Smart Large Objects: No sbspace number specified.
    at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:412)
    at com.informix.jdbc.IfxSqli.E(IfxSqli.java:3876)
    ... 59 more

我创建了类似的表和简单的Jython程序,用于测试插入
BLOB
列并从中进行选择

作为测试数据,我使用了带有snoopy卡通的GIF文件:-)

它创建与snoopy comics20121023.gif相同的
test.*.gif
文件


所以我的结论是你们的环境有问题。我怀疑JDBC驱动程序。

根据我的经验,当没有定义临时sb空间时,就会发生这种情况

有关如何创建sb空间的示例如下:

onspaces -c -S sbddbs -p /infentw/sbdbs01.dat -o 0 -s 1000000
onbar -b -F
还必须将其添加到$ONCONFIG中:

SBSPACENAME     sbddbs       # Default smartblob space name
最后,您必须重新启动informix服务器

onmode -ky; oninit -v

您是否能够在没有最后一个BLOB列的情况下插入数据?还向我们展示如何定义此列。您使用哪种
BLOB
?使用
Create TABLE
、两列和
INSERT
创建简单示例。向我们展示Informix版本和JDBC驱动程序版本。ddl已更新。当我错过了blobl列插入工作正常,当我想添加只是blobl例外是相同的平台和版本你的意思是什么?我使用的是informix db版本12.10,这就是我的意思:哪个版本的informix服务器(你说的是12.10),哪个版本的informix JDBC驱动程序(可能是CSDK 4.10附带的版本),以及你在哪个O/s上运行它?我不是JDBC专家,但给出的错误消息(加上省略BLOB列时它可以工作的事实)表明出现了严重错误;我建议联系您的支持渠道(最终是IBM/Informix技术支持),以获取建议。嗯,我不确定。AIXVersion7.1这可以是您想要的吗?请检查我的更新。当我将
setBinaryStream()
更改为
insert stmt.setBytes(2[0,1,2,3])
时,我正在使用setBytes存储blob no setBinaryStream()它仍然有效。当然现在我没有收到GIF文件,但结果文件由os 4个字节组成:
00 01 02 03
。简而言之:适合我。我仍然认为JDBC驱动程序有问题。见:
onmode -ky; oninit -v