簡體   English   中英

Java預處理語句不適用於我的循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM