[英]Java Prepared Statement not working with my loop
我對此並不陌生,並嘗試使用准備好的語句將一些日期添加到Oracle數據庫中。 這是我的代碼:
CODE REMOVED, code updated.
這將產生以下結果:
INSERT into TEST_RESULTS12233 (DB_ID, DATED1, DATED2, DATED3, DATED4) values (t1_seq.nextval, to_date(?, 'dd/mm/yyyy hh24.mi'), to_date(?, 'dd/mm/yyyy hh24.mi'), to_date(?, 'dd/mm/yyyy hh24.mi'), to_date(?, 'dd/mm/yyyy hh24.mi'))
Event1
Event2
Event3
Event4
Exception in thread "main" java.sql.BatchUpdateException: ORA-01858: a non-numeric character was found where a numeric was expected
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10500)
at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:230)
at sandpit.testsand.main(testsand.java:85)
如果我將SetString中的pstatement替換為Event1,則執行批處理。 有誰知道我該怎么做? 謝謝
這是要求的完整代碼:
//MORE CODE AS REQUESTED
String inserttotable = "INSERT into TEST_RESULTS12233 (DB_ID";
String stateclose = ")";
String insertvalues =(" values (t1_seq.nextval");
StringBuilder insertBuilder = new StringBuilder();
StringBuilder valueBuilder = new StringBuilder();
int timestoloop = 4;
for (i=1; i<=timestoloop; i++)
{
insertBuilder.append(", DATED"+i);
valueBuilder.append(", to_date(?, 'dd/mm/yyyy hh24.mi')");
}
String finalinsert = inserttotable + insertBuilder.toString()+ stateclose;
String finalvalues = insertvalues + valueBuilder.toString() + stateclose;
String insertsql = finalinsert + finalvalues;
System.out.println(insertsql);
String insertresults = insertsql;
PreparedStatement prepState = conn.prepareStatement(insertresults);
String Event1 = "22122014 13.26";
String Event2 = "22122014 13.27";
String Event3 = "22122014 13.28";
String Event4 = "22122014 13.29";
for (i=1; i<=timestoloop; i++)
{
String pstatement = "Event"+i;
System.out.println(pstatement);
prepState.setString(i, pstatement);
}
prepState.addBatch();
prepState.executeBatch();
通過將計數器附加為String
文字( Event1
)並將其設置為Prepared語句作為String
輸入來動態創建變量名,使您陷入混亂。 您實際上是在設置String
文字,例如( Event1
)而不是值( 22122014 13.26
)。 這不是您應該做的方式,您可能需要像
prepState.setString(1, Event1);
prepState.setString(2, Event2);
prepState.setString(3, Event3);
prepState.setString(4, Event4);
我建議您選擇具有所有Event值的String文字列表。 對其進行迭代,並在Prepared語句中進行設置,然后執行查詢。
List<String> eventValues = new ArrayList<String>();
我相信您提到您已經嘗試過一個arraylist,但是它應該看起來像這樣:
List<String> events=new ArrayList<String>();
events.add("22122014 13.26");
events.add("22122014 13.27");
events.add("22122014 13.28");
events.add("22122014 13.29");
for (i=1; i<=timestoloop; i++)
{
String pstatement = "Event"+i;
System.out.println(pstatement);
prepState.setString(i, events.get(i));
prepState.addBatch();
}
您使用的是變量而不是實際變量中的字符串“ Event1”。 prepState.setString(i,“ event” + i)不等於prepState.setString(i,event1)。 一個簡單地返回一個字符串,一個簡單地是一個保存字符串值的變量,后者是您想要的一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.