精疲力尽的结果集java sqlexception

时间:2018-10-11 18:31:30

标签: java oracle jdbc

我一直在获取错误用尽的结果集,而没有真正知道我在做什么,我基本上是在尝试将数据库中的3行存储到名为“ Logement”的类的3个元素的数组中我的uni项目,以后将用于填充javafx ui中的许多复选框

package accesBD;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import metier.ConvIntToBool;
import metier.Logement;

public class LogementDAO {
    TypeLogementDAO bd = new TypeLogementDAO();


    public Logement[] findAll() throws SQLException {
        Logement logements[] = null;
        Connection cnx= SConnection.getInstance();
        Logement logement = null;
        try {
            PreparedStatement st= cnx.prepareStatement("select* from logement");
            ResultSet res= st.executeQuery();
            int i =0;
            while (res.next()) {
                logement= new Logement(bd.find(res.getInt(1)), ConvIntToBool.boolToInt(res.getInt(2)) ,ConvIntToBool.boolToInt(res.getInt(3)),ConvIntToBool.boolToInt(res.getInt(4)),ConvIntToBool.boolToInt(res.getInt(5)),ConvIntToBool.boolToInt(res.getInt(6)));
                //System.out.println(res.getRow());
                logements[i]=logement;
                i++;
                }
            st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return logements;//la collection retournée peut être vide
    }
}

These是我要从数据库接收的3行

这是find方法的代码

public TypeLogement find(int id){
        Connection cnx =SConnection.getInstance();
        TypeLogement c=null;
        try {PreparedStatement stp1=cnx.prepareStatement("select * from typelogement where id=?");
            stp1.setInt(1, id);
            ResultSet n= stp1.executeQuery();
            while(n.next()){
                c= new TypeLogement(n.getInt(1),n.getString(2),n.getDouble(3));
            }
            cnx.close();

        } catch (SQLException e) {

            e.printStackTrace();
        }
        return c;

    }

1 个答案:

答案 0 :(得分:2)

类似的问题是因为您关闭了数据库连接: 您使用Connection cnx= SConnection.getInstance();来获得findAll()find()的连接。然后在find()中关闭连接。因此发生以下情况:

  1. 您在findAll()中打开连接
  2. 您获得外部ResultSet并对其进行迭代
  3. 在循环中,您调用find()
  4. 您致电Connection cnx= SConnection.getInstance();并获得内部ResultSet
  5. 您在find()中关闭了连接。关闭连接时,它将关闭在该连接中打开的所有结果集
  6. 外部ResultSet的循环失败,因为由于find()方法中的关闭连接而关闭了结果集

代替关闭连接,您需要使用ResultSet方法关闭find()