从数据库

时间:2017-03-23 16:45:29

标签: java mysql sql pdf resultset

这是我执行代码时显示的错误日志

  

java.sql.SQLException:ResultSet关闭后不允许操作
  在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964)
  在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
  在com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
  在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();
    }
}    
}

我所知道的或者我认为错误在于检索数据库条目但我真的不知道究竟是什么。我一直在尝试解决方案,似乎无法在脑海中找到它。提前谢谢你

2 个答案:

答案 0 :(得分: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();        ...

答案 1 :(得分:1)

您过早关闭文档等。

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

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

文档关闭后(即在循环的第二次迭代中),您无法再添加任何内容。如果将close语句移到while循环之后,你应该没问题:

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

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