2017-03-23 63 views
1

讀取時,當我執行的代碼這顯示錯誤日誌「不允許操作後結果集關閉」從數據庫

java.sql.SQLException中:不允許操作結果集在com.mysql關閉
後.jdbc.SQLError.createSQLException(SQLError.java:964)
在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886 )
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
在com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:743)
在com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:6301)
在reportpdf.ReportPDF.main(ReportPDF.java: 84)

這裏是我的代碼:

import com.itextpdf.text.Chunk; 
import com.itextpdf.text.Document; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.Font; 
import com.itextpdf.text.Paragraph; 
import com.itextpdf.text.Phrase; 
import com.itextpdf.text.pdf.PdfPCell; 
import com.itextpdf.text.pdf.PdfPTable; 
import com.itextpdf.text.pdf.PdfWriter; 
import com.mysql.jdbc.Connection; 

import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.time.LocalDate; 
import java.util.Date; 

public class ReportPDF { 
    private static Font headerFontBold = new         Font(Font.FontFamily.UNDEFINED,14,Font.BOLD); 
    private static Font headerFont = new Font(Font.FontFamily.UNDEFINED,12); 
    private static Font titleFont = new Font(Font.FontFamily.UNDEFINED,12,Font.BOLD); 
    private static LocalDate localDate = LocalDate.now(); 
    private static String output = ""+localDate; 

    public static void main(String[] args) { 
    Document document = new Document(); 
    try { 
     PdfWriter.getInstance(document,new FileOutputStream("Inventory Report "+output+".pdf")); 
     document.open(); 

     Paragraph para1 = new Paragraph("Company Name", headerFontBold); 
     para1.setAlignment(Paragraph.ALIGN_CENTER); 
     para1.setSpacingAfter(2); 
     document.add(para1); 

     Paragraph para2 = new Paragraph("Address", headerFont); 
     para2.setAlignment(Paragraph.ALIGN_CENTER); 
     para2.setSpacingAfter(2); 
     document.add(para2); 

     Paragraph para3 = new Paragraph("Inventory Report", headerFont); 
     para3.setAlignment(Paragraph.ALIGN_CENTER); 
     para3.setSpacingAfter(20); 
     document.add(para3); 

     Paragraph para4 = new Paragraph("Inventory Report as of: "+ new Date(), titleFont); 
     para4.setAlignment(Paragraph.ALIGN_LEFT); 
     para4.setSpacingAfter(2); 
     document.add(para4); 

     Paragraph para5 = new Paragraph("Generated by: ", titleFont); 
     para5.setAlignment(Paragraph.ALIGN_LEFT); 
     para5.setSpacingAfter(2); 
     document.add(para5); 

     Paragraph para6 = new Paragraph("Generated for date/s: ", titleFont); 
     para6.setAlignment(Paragraph.ALIGN_LEFT); 
     para6.setSpacingAfter(20); 
     document.add(para6); 

     try{ 
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
      Connection con=(Connection) DriverManager.getConnection ("jdbc:mysql://localhost:3306/pdfreport?autoReconnect=true&useSSL=false", "root", "root"); 
      Statement st = (Statement) con.createStatement(); 
      ResultSet rs = st.executeQuery("select id, firstName, lastName, emailAddress, birthday, age from pdfreport.registration;"); 

      PdfPTable recordTable = new PdfPTable(6); 
      PdfPCell recordCell; 

      while (rs.next()) {     
       String id = rs.getString("id"); 
       recordCell=new PdfPCell(new Phrase(id)); 
       recordTable.addCell(recordCell); 

       String firstName=rs.getString("firstName"); 
       recordCell=new PdfPCell(new Phrase(firstName)); 
       recordTable.addCell(recordCell); 

       String lastName=rs.getString("lastName"); 
       recordCell=new PdfPCell(new Phrase(lastName)); 
       recordTable.addCell(recordCell); 

       String emailAddress=rs.getString("emailAddress"); 
       recordCell=new PdfPCell(new Phrase(emailAddress)); 
       recordTable.addCell(recordCell); 

       String birthday=rs.getString("birthday"); 
       recordCell=new PdfPCell(new Phrase(birthday)); 
       recordTable.addCell(recordCell); 

       String age=rs.getString("age"); 
       recordCell=new PdfPCell(new Phrase(age)); 
       recordTable.addCell(recordCell); 

       document.add(recordTable);      
       rs.close(); 
       st.close(); 
       con.close(); 
       document.close();      
      }    
     } 
     catch (ClassNotFoundException | IllegalAccessException | InstantiationException | SQLException e){ 
      e.printStackTrace(); 
     } 
     document.close(); 
    } catch (DocumentException | FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
}  
} 

我知道什麼,或者我認爲錯誤是在檢索數據庫中的條目,但我真的不知道究竟是什麼。我一直在嘗試解決方案,而且似乎無法在我的腦海中得到它。謝謝你提前

回答

3

您關閉結果集 while循環,所以rs.next()下次調用失敗,錯誤你:

while(rs.next()) 
{ 
    .... 

    rs.close(); 
    st.close(); 
    con.close(); 
    document.close();  ... 
} 

所以在第二次迭代嘗試從讀一個已關閉結果集。

搬完close()呼叫while外循環:

while(rs.next()) 
{ 
    .... 
} 
rs.close(); 
st.close(); 
con.close(); 
document.close();  ... 
+0

我試過這個非常感謝你! –

1

你太早關閉您的文檔等。

while (rs.next()) 
{     
    // do some stuff 

    document.add(recordTable);      
    rs.close(); 
    st.close(); 
    con.close(); 
    document.close(); 
} 

一旦文檔被關閉(即循環的第二次迭代),就不能再添加任何東西了。如果你移動閉環語句到while循環後,你應該沒問題:

while (rs.next()) 
{     
    // do some stuff 

    document.add(recordTable);      
} 
rs.close(); 
st.close(); 
con.close(); 
document.close(); 
相關問題