2012-01-12 65 views
0

我遇到了java.sql.ResultSet問題,我有一個java.sql.PreparedStatement,我在其上運行executeQuery()以返回ResultSet,但嘗試您可以通過查詢我得到拋出的異常的結果:SQLException,ResultSet已關閉,但我可以找出原因

異常:java.sql.SQLException中的消息:不允許操作後 的ResultSet關閉。

從網上搜索,它看起來像一個結果可以最終被關閉幾個原因:

  1. 生成它的PreparedStatement對象已關閉。
  2. 生成它的PreparedStatement對象被重新執行。
  3. 生成它的PreparedStatement對象用於從多個結果序列中檢索下一個結果。
  4. 關閉用於生成PreparedStatement的連接。

我檢查了我的代碼,沒有做這些事情。下面的代碼片段引起該問題:

PreparedStatement psAccountPartyIdByEmail = null; 
.... 
try { 
    String [] nextLine; 
    while ((nextLine = reader.readNext()) != null) { 
     String email = nextLine[0]; 
     ..... 
     try { 
      if (psAccountPartyIdByEmail == null) { 
       psAccountPartyIdByEmail = session.connection().prepareStatement(SQL_GET_ACCOUNTPARTYID_BY_EMAILADDRESS); 
      } 

      psAccountPartyIdByEmail.setString(1, email); 
      ResultSet partyIds = psAccountPartyIdByEmail.executeQuery(); 

      while (partyIds.next()) { 
       String partyId = partyIds.getString(1); 
       ..... 
      } 
     } catch (SQLException e) { 
      Debug.logError(e, "Encountered SQLException while running group service.", MODULE); 
     } 
    } 
} catch (IOException e) { 
    Debug.logError(e, "Problem reading line in file", MODULE); 
} 

試圖執行時拋出異常:while (partyIds.next()) {

就像我說我從來沒有關閉連接或聲明,你可以看到我不在嘗試查看我的結果之前,不要重複使用該聲明。

感謝他幫助...

馬克

回答

0

我不知道這是否會解決這個問題,但你可以/應該將

if (psAccountPartyIdByEmail == null) { 
      psAccountPartyIdByEmail = session.connection().prepareStatement(SQL_GET_ACCOUNTPARTYID_BY_EMAILADDRESS); 
     } 

外while循環。 另外,在處理完行後關閉ResultSet。 然後,當你們都完成了你的陳述和聯繫。

+0

我已經嘗試了您的兩項建議,但沒有任何區別。出於好奇,你爲什麼要將上面的代碼移到循環之外,爲什麼你認爲這會有所作爲。 – 2012-01-12 15:50:20

+0

我希望ResultSet的關閉可以做到這一點。至於移動PS創作,沒有理由繼續在循環中檢查它;除非可能沒有reader.nextLine(),在這種情況下PS將無緣無故地創建。 – 2012-01-12 16:37:36

+0

你使用的是什麼數據庫和驅動程序? – 2012-01-12 16:37:54

相關問題