使用spring的jdbcTemplate和存储过程将byte []插入blob字段

发送

我试图插入byte[]到带有存储过程的blob字段中,并获得Exception:

请求处理失败;嵌套的异常是org.springframework.jdbc.BadSqlGrammarException:PreparedStatementCallback; 错误的SQL语法[从sp_NEWFILE(?,?,?)中选择ID];嵌套的异常是org.firebirdsql.jdbc.field.TypeConversionException:转换为对象时出错。

模型:

public class fileBody { 
private int ID;
private byte[] BODY;
private String FILENAME; //getters an setters}

将其插入数据库

public class FileBodyDaoImpl implements FileBodyDao {

public int insertData(final FileBody fileBody) throws IOException {     
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    LobHandler lobHandler = new DefaultLobHandler();        
    final InputStream in = new ByteArrayInputStream(fileBody.getBODY());
    final int fileSize = in.available();
    Map<String, Object> out = jdbcTemplate.queryForMap("SELECT ID FROM  sp_NEWFILE(?,?,?)",
            new AbstractLobCreatingPreparedStatementCallback(lobHandler) {
                protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException,
                        DataAccessException {
                    ps.setString(1, fileBody.getFILENAME());
                    lobCreator.setBlobAsBinaryStream(ps, 2, in, fileSize);
                    ps.setNull(3, java.sql.Types.INTEGER);
                }
            });     
    int last_inserted = Integer.parseInt(String.valueOf(out.get("ID")));
    return last_inserted;
}

还有我的存储过程

create or alter procedure sp_NEWFILE (
FILENAME varchar(255),
BODY blob sub_type 0 segment size 80,
USEID integer)
returns (
ID integer)
as
begin
  if (useid is not null) then ID=USEID;
  else ID=GEN_ID(gen_filebody_id,1);
  if ((FILENAME is NULL) or (FILENAME=''))  then FILENAME='UNDEFINED';
  INSERT INTO  t_filebody(ID,BODY,FILENAME) VALUES(:ID,:BODY,:FILENAME);
  suspend;
end^

我得到一个例外:

Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: 
PreparedStatementCallback; 
bad SQL grammar [SELECT ID FROM sp_NEWFILE(?,?,?)]; nested exception is org.firebirdsql.jdbc.field.TypeConversionException: Error converting to object.

版本:jaybird-jdk17-2.2.5; 来源:firebird2.5版本:2.5.1.26351.ds4-2ubuntu0.1;

马克·罗特·韦尔

问题是,queryForMap它不支持PreparedStatementCallback(例如execute),与您的匿名对象相反,它被视为要执行查询的常规参数,而Jaybird不支持此对象类型。而且如果Jaybird支持它,您将因缺少参数2和3而收到错误消息。

通过传递字节数组可以大大简化您的代码:

Map<String, Object> out = jdbcTemplate.queryForMap("SELECT ID FROM sp_NEWFILE(?,?,?)",
        fileBody.getFILENAME(), fileBody.getBODY(), null);

这就像Jaybird认为aBLOB SUB_TYPE 0一样工作,java.sql.Types.LONGVARBINARY而JDBC 4.2附录B声明这byte[]是该类型的默认类型(尽管您也可以将其用作a java.sql.Types.BLOB)。

附带说明一下,您的存储过程不必是可选的(删除SUSPEND使其可执行),也可以通过使用TRIGGER来生成该主键,并使用INSERT .. RETURNING ..或通过JDBC生成的键功能来检索该值,从而替换该过程。(依次通过,在Jaybird中实现INSERT .. RETURNING ..)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用INSERT INTO语句将简单值插入BLOB字段?

来自分类Dev

使用ADO将原始文件数据插入Access表的BLOB(“ OLE对象”)字段中

来自分类Dev

将二进制图像数据插入 MySQL blob 字段时如何防止“SQL 语法错误”?

来自分类Dev

使用插入和选择语句的存储过程

来自分类Dev

将大文本插入Blob

来自分类Dev

如何使用knex插入blob?

来自分类Dev

如何使用 Python 将 BLOB 插入 Oracle?

来自分类Dev

使用spring jdbcTemplate将数据插入多个表

来自分类Dev

将xml插入XmlType字段

来自分类Dev

将文档作为字段插入

来自分类Dev

将文档作为字段插入

来自分类Dev

如何使用jQuery插入字段?

来自分类Dev

在 PHP 中选择和插入 BLOB 数据

来自分类Dev

将BLOB数据插入对象类型-Oracle

来自分类Dev

将图像插入Blob类型表的问题

来自分类Dev

如何使用存储过程在mysql中选择和插入值

来自分类Dev

如何使用存储过程在mysql中选择和插入值

来自分类Dev

使用合并(更新/插入)和分组依据的 SQL 存储过程

来自分类Dev

使用存储过程将数组插入到SQL的表中

来自分类Dev

如何使用VB.NET将DataAdapter配置为对选择,更新,插入和删除命令使用Sql Server存储过程?

来自分类Dev

AWK - 匹配字段 1,将字段 2 插入字段 2

来自分类Dev

使用python在mySQL BLOB中插入和检索PDF

来自分类Dev

存储过程插入(选择和值)

来自分类Dev

将插入字段的数量与动态插入的文本框匹配

来自分类Dev

将数据插入Postgresql的存储过程

来自分类Dev

将下拉值插入文本字段

来自分类Dev

mongodb将新字段插入数组

来自分类Dev

将数字插入单个字段MySQL

来自分类Dev

将动态字段值插入MySQL表

Related 相关文章

热门标签

归档