【问题标题】:Exhausted resultset java sqlexception用尽的结果集java sqlexception
【发布时间】:2018-10-11 18:31:30
【问题描述】:

我一直在得到错误耗尽的结果集,但我并没有真正知道我在做什么,我基本上是在尝试将数据库中的 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;

    }

【问题讨论】:

  • 请在问题中添加完整的异常堆栈跟踪
  • 如果您打算返回多个TypeLogement,您需要创建一个List<TypeLogement> 并将新的TypeLogement 添加到该列表中。然后返回列表。另外,我没有看到 id 列。您似乎还声明了一个数组,但从未设置大小。 Logement logements[] = null;
  • 您的代码似乎产生了 N+1 个查询,而您可能只需一个查询就可以完成所有这些。此外,find 中的cnxfindAll 中的连接是否相同?如果是这样,您关闭了连接,这意味着任何派生结果集也将关闭(包括findAll 中的那个)。
  • @Ivan 你的意思是我得到的整个文本都是错误的?对不起,我还是个初学者。
  • @MarkRotteveel 谢谢下面的人也指出了这一点,现在我删除了 close();在find 方法中,但现在我在这一行得到nullpointerexception 错误logements[i]=logement;

标签: java oracle jdbc


【解决方案1】:

看起来问题是因为您关闭了数据库连接: 您使用Connection cnx= SConnection.getInstance();findAll()find() 中获得连接。在find() 你关闭连接。所以会发生以下情况:

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

您需要在find() 方法中关闭ResultSet,而不是关闭连接。

【讨论】:

  • 好的,我在 find 方法中关闭了结果集,用尽的结果集错误似乎消失了,但现在我在这一行得到一个空指针异常:logements[i]=logement;
  • 使用List<Logement> 代替数组,因为数组应该使用预定义的大小进行初始化,并且该大小不能更改。由于Logement logements[] = null;,您需要先初始化数组
  • 好的,我做到了,但现在我真的不知道如何恢复我在List<Logement> 中拥有的三个Logement 对象
  • 具体的问题是什么?
  • 我只想将List<Logement> 转换为3 个单独的Logement 对象,我不知道该怎么做,因为我是初学者,还不够熟练,你能帮帮我吗?编辑:您可能已经注意到我在数据库中只有 3 行,所以实际上List<Logement> 只有 3 个 Logement 对象,我想将它们恢复为 3 个单独的对象。
猜你喜欢
  • 1970-01-01
  • 2012-03-12
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 2011-04-12
  • 1970-01-01
  • 2014-06-06
相关资源
最近更新 更多