2

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

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[]始终是正确的 count(32) 并且参数始终处于相同的顺序。现在虽然它必须处理传递一个较小的数组(18、19 或 20)并且仍然正确地进行插入;最后 14 个左右的 args 可以为空或空白。值的顺序仍然是静态的(即,如果传递 18 列,则它是表中的前 18 列)并且最后 20 列都是int(11)列。

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

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. 

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

4

1 回答 1

0

只要列排序是静态的并且缺少的列都是int数据库中的所有类型,您就应该能够为每个剩余的缺少参数绑定一个空值。像这样的东西应该工作:

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();

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

于 2014-01-25T05:45:11.640 回答