2014-01-25 262 views
2

我正在使用JDBI將一些數據插入到具有自動增量主鍵的mysql表中。我用索引來做插入。代碼如下所示:JDBI插入問題

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個左右的參數可以是空的或空白的。值的順序仍然是靜態的(即,如果傳遞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. 

什麼是解決它的最好方法?

回答

0

只要列排序是靜態的,缺失的列都是DB中的所有類型,那麼您應該只能爲每個剩餘的缺失參數綁定一個空值。像這樣的東西應該工作:

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

這就是說,最好是按名稱而不是使用索引綁定每個參數。