2015-12-02 56 views
1

我想基於以下代碼一個MySQL表中插入信息插入過程中寫一個try catch特殊異常消息:在一個MySQL表

public void writeMapDocNameToDocId(File file, ArrayList<String> docNames) { 
      PreparedStatement preparedStmt= null; 
      try{ 
       conn.setAutoCommit(false); 
       String query = " insert into DocumentNameId (docName)" 
         + " values (?)"; 
       preparedStmt = conn.prepareStatement(query); 
       int i=0; 


       for (String docName : docNames) 
       { 
        preparedStmt.setString (1, docName); 
        preparedStmt.addBatch(); 
        i++; 
        if (i % 1000 == 0 || i == docNames.size()) { 
         preparedStmt.executeBatch(); 
        } 
       } 
       conn.commit(); 
       preparedStmt.close(); 
       conn.setAutoCommit(true); 
      } 
      catch(Exception e){ 
       e.printStackTrace(); 
      } 

     } 

我有以下錯誤一些可採用DocName的。

java.sql.BatchUpdateException: Data truncation: Data too long for column 'docName' at row 1 
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1269) 
    at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:955) 
    at dataLayer.RepositorySQL.writeMapDocNameToDocId(RepositorySQL.java:508) 

我想知道哪些docNames造成這個錯誤,但我不知道我應該怎麼寫漁獲消息告訴我docName.Since,DOCNAME在卡位體是不明確的。

我不是java和MySQLso的專家,我的代碼可能基於錯誤的基礎。請幫我瞭解我的錯誤

+3

從你已經得到的最簡單的方法就是將'i'的聲明移到'try'之外,然後在異常中移動'i'的值,確定哪個元素在你的數組中導致了錯誤。 – CubeJockey

+0

在循環中打印出'docName'。或者更好^ – 3kings

+0

@ 3kings我試過,但它是代碼的一部分,這個函數調用更復雜的類,這個函數調用的次數超過100000次。 – Suri

回答

1

這裏是代碼的說明,根據我comment以上:

int i=0; //Declare i outside of your try-catch statement 

try{ 
    ... 
    for (String docName : docNames){ 
     preparedStmt.setString (1, docName); 
     preparedStmt.addBatch(); 
     i++; 
     if (i % 1000 == 0 || i == docNames.size()) { 
      preparedStmt.executeBatch(); 
     } 
    } 
    ... 
} 
catch(Exception e){ 

    String docNameError = docNames.get(i - 1); 
    //subtract 1 from i, because i is only incremented after a successful add 
    //to your prepared statement. 

    //use docNameError however you'd like to report the exception 

    e.printStackTrace(); 
} 

或者,你可以在你的for-each每次循環的開始遞增i,以避免你的catch中的減法:

for (String docName : docNames){ 
    i++; 
    preparedStmt.setString(1,docName);