2012-05-15 32 views
0

以下代碼給出了BatchUpdateException,我不知道爲什麼。SQL處理中的Java BatchUpdateException

public void createContactmoment(Document document) { 
    try { 
     c = MySqlDAOFactory.getInstance().getConnection(); 
     // 
     c.setAutoCommit(false); 
     // 
     String sql = "insert into index(iddocument,chapter,chapterdate)" 
       + "values (?,?,?)"; 
     // 
     prest = c.prepareStatement(sql); 
     // 
     int count = 1; 
     //Formatter for the time 
     DateTimeFormatter format = DateTimeFormat.forPattern("dd-MM-yyyy"); 
     // 
     while (count <= Integer.parseInt(document.getTeachingWeeks()) 
      || count == document.getAllDates().size() 
      || count == document.getContactMomentList().size()) { 
      // 
      if (MysqlDocumentDAO.getInstance().findByName(
        document.getName()) == -1) 
       return; 
      // 
      prest.setInt(1,MysqlDocumentDAO.getInstance().findByName(
      document.getName())); 
      if (document.getContactMomentList().get(count) != null) 
      prest.setString(2,document.getContactMomentList().get(count)); 
      else 
      prest.setString(2, "No contactmoment found, but expected"); 
      // 
      if (document.getAllDates().get(count) != null) 
       prest.setString(3,(format.print(document.getAllDates().get(count)))); 
      else 
      prest.setString(3, "Na date found, but expected"); 
      // 
      prest.addBatch(); 
      // 
      count++; 
     } 
     // 
     prest.executeBatch(); 
     c.commit(); 
     // 
    } catch (SQLException e) { 
     JdbcLogging.info("Dit trad op bij het uitvoeren van de batchtaak (contactMoments)"+ " :" + e); 
    } finally { 
     MySqlConnectionFactory.getInstance().closeStatement(prest); 
     MySqlConnectionFactory.getInstance().closeConnection(c); 
    } 
} 

我在日誌中看到的錯誤是:

信息JdbcLogging:25 - 秩繁體運BIJ HET uitvoeren範·德·batchtaak(contactMoments):java.sql.BatchUpdateException:您有一個錯誤在你的SQL語法中;檢查對應於你的MySQL服務器版本使用附近的人指數(iddocument,章,chapterdate)值(44'Examen正確的語法手冊; * Verdedigen工程」,‘’在1號線

所以似乎在最後一次更新我錯過了一些數據。我想寫的數據確實excist(我檢查與系統打印行。

任何建議將是更然後歡迎。

回答

3

index是一個保留單詞並且不應該用於表名稱。在您的查詢中,將單詞'index`放入`back quotes`並執行然後它應該工作。

String sql = "insert into `index`(iddocument,chapter,chapterdate) values (?,?,?)"; 
+0

我重命名錶末端重構我的代碼,它的伎倆! –

1

嘗試添加2 SQL線之間的空間 - 在)和詞values要分開......

String sql = "insert into index (iddocument,chapter,chapterdate) " 
      + "values (?,?,?)"; 

同樣,它不會傷害嘗試index之間加空格和( - 這隻取決於SQL解釋器的挑剔程度。

另外,index是表名的錯誤名稱,因爲索引在許多數據庫中都有特殊含義。我認爲index是你的表的名字,而你實際上並沒有試圖將數據插入索引!?

最後,不知道在聲明結尾是否需要;?在構建這樣的代碼時通常不需要這麼做,所以也許先嚐試一下,如果還有問題,也許以後再添加它。

+0

''後面沒有空格,'values'不是錯誤。而';'是語句結尾的JAVA語法的一部分。 –

+0

那麼,在例外輸出它顯示'chapterdate)值(即沒有空間),所以我想知道SQL解釋器是否真的在那裏期待一個空間?它在技術上並不是一個錯誤,但它確實使解釋器難以正確地計算出SQL語句應該做什麼。 – wattostudios

+0

異常跟蹤實際上從'index(id ...'開始,意味着錯誤是在'index'之前或之前開始的 –