gpt4 book ai didi

java - 从数据库读取时为 "Operation not allowed after ResultSet closed"

转载 作者:行者123 更新时间:2023-11-29 04:35:39 26 4
gpt4 key购买 nike

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

java.sql.SQLException: Operation not allowed after ResultSet closed
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:743)
at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:6301)
at 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();
}
}
}

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

最佳答案

您在 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(); ...

关于java - 从数据库读取时为 "Operation not allowed after ResultSet closed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42982160/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com