2017-03-23 64 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(); 
相关问题