我在尝试访问此返回的 resultSetCustomer.from 其他方法时遇到错误 "java.sql.SQLException: After end of result set"

I am getting error "java.sql.SQLException: After end of result set" while trying to access this returned resultSetCustomer.from other methode

 public ResultSet getAllCustomer() throws SQLException{
  //List L = new ArrayList();
    try {
           stm = con.prepareStatement("select * from customer");
     
      resultSetSubject = stm.executeQuery();
        while (resultSetCustomer.next()) {
            
            //L.add(resultSetCustomer);
            
         resultSetCustomer.getInt(1);
             resultSetCustomer.getString(2);
             
           
            
            //System.out.println(resultSetCustomer.getInt("id")+" "+resultSetCustomer.getString("name"));
           
        }
    } catch (Exception e) {
         System.out.println(e);
    } 
     
       
  return resultSetCustomer;
   
}

让我简单介绍一下,我正在从客户 table 获取所有记录并作为结果集返回。我正在访问返回的结果集

结果集 rs = T.getAllCustomer();

          System.out.println(rs.getInt("id")+" "+rs.getString("name")); 

您的代码中存在几个问题:

  1. 您正在获取一个 ResultSet 对象,遍历其中的所有行,获取列值,然后 returning 这个 ResultSet 对象.当它被 returned 给调用者时,它已经被处理行的循环消耗掉了(这是你问题中错误的原因)。

  2. 不要 return ResultSet 对象,而是创建一个映射到数据库中数据的 Customer 实体 class,并且return Customer 的实例。返回一个 ResultSet 对象真的很糟糕,因为它无法控制对象的关闭方式,也不会使您的代码面向对象。

  3. 如果您没有参数化查询,则无需创建准备好的语句。

  4. Statement(和 ResultSet)必须在 closed 后完成。您应该将处理整个结果的代码包装在 try-with-resources statement.

您的代码几乎不需要修改

1 > 确保您使用的结果集变量与定义的相同(代码中有一处不同)。

2> 仅使用

public ResultSet getAllCustomer() throws SQLException{
try {
       stm = con.prepareStatement("select * from customer");
 
  resultSetCustomer = stm.executeQuery();
   
} catch (Exception e) {
     System.out.println(e);
}  
  return resultSetCustomer;

}

3> 在单独的方法中关闭你的 connection/resultset/statement 否则你会得到错误。你可以使用如下

public void close() throws SQLException{
     
     if (resultSetCustomer != null) {
         resultSetCustomer .close();
     }
     if (stm !=null) {
         stm.close();
     }
 }

4> 在访问时使用结果集(您的结果集实例).next()