首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDBI插入问题

JDBI插入问题
EN

Stack Overflow用户
提问于 2014-01-25 05:34:46
回答 1查看 2.5K关注 0票数 2

我使用JDBI将一些数据插入到具有自动增量主键的mysql表中。我使用索引来进行插入。代码如下所示:

代码语言:javascript
复制
public void insertWorkout(String[] values) {
    String insertString = "insert into workouts(<column_names>) values(:0,:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17,:18,:19,:20,:21,:22,:23,:24,:25,:26,:27,:28,:29,:30,:31)";
    Update pUpdate = handle.createStatement(insertString);

    for(int i=0; i<vals.length;i++) {
        pUpdate.bind(i, vals[i]);
    }

    pUpdate.execute();
}

这已经很好地工作了一段时间,因为values[]总是正确的计数(32),并且参数总是保持相同的顺序。现在,它将不得不处理被传递的一个较小的数组(18,19,或20),并且仍然正确地执行插入;最后14个左右的args可以是空的,也可以是空的。值的顺序仍然是静态的(即,如果传递18列,它是表中的前18列),最后20列都是int(11)列。

现在,当它传递一个小于32的数组时,它会产生如下错误:

代码语言:javascript
复制
org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException: Unable to execute, no named parameter matches "20" and no positional param for place 20 (which is 21 in the JDBC 'start at 1' scheme) has been set. 

解决这个问题的最好方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-25 05:45:11

只要列排序是静态的,并且缺少的列都是DB中的int类型,您就应该能够为每个剩余的缺失参数绑定一个null。像这样的事情应该有效:

代码语言:javascript
复制
String insertString = "insert into workouts....."
Update pUpdate = handle.createStatement(insertString);

for(int i=0; i<vals.length;i++) {
        pUpdate.bind(i, vals[i]);
}

if (values.length < 32) {
    for(int i =(32 - values.length); i<32;i++) {
        pUpdate.bindNull(i, java.sql.Types.INTEGER);
    }
}

pUpdate.execute();

也就是说,最好用名称来绑定每个参数,而不是使用索引。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21347091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档