我在尝试从其他方法访问此返回的 resultSetCustomer. 时收到错误“java.sql.SQLException:结果集结束后”

Posted

技术标签:

【中文标题】我在尝试从其他方法访问此返回的 resultSetCustomer. 时收到错误“java.sql.SQLException:结果集结束后”【英文标题】:I am getting error "java.sql.SQLException: After end of result set" while trying to access this returned resultSetCustomer.from other methode 【发布时间】:2021-02-26 14:48:22 【问题描述】:
 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;
   

简单来说,我正在从客户表中获取所有记录并作为结果集返回。我正在访问返回的结果集

结果集 rs = T.getAllCustomer();

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

【问题讨论】:

【参考方案1】:

您的代码中有几个问题:

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

    不要返回ResultSet 对象,而是创建一个映射到数据库中数据的Customer 实体类,并返回Customer 的一个实例。返回一个ResultSet 对象真的很糟糕,因为它不能控制对象的关闭方式,也不能让你的代码面向对象。

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

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

【讨论】:

感谢您的帮助。请注意,我的程序需要返回结果集而不是任何客户实例。我做了关闭语句和结果集,但是它显示错误,因此尝试其他过程来测试粘贴的avobe。解决方案需要是我如何返回结果集。请对此有任何意见,我该怎么做? @NEHASURDESHAI 代码中的主要问题是您正在处理方法本身中的结果集(while (resultSetCustomer.next()) 循环)。这部分应该由方法的调用者完成,而不是方法本身。在方法中处理结果集是在消耗结果集,因此调用者尝试使用它时会导致错误。【参考方案2】:

您的代码几乎不需要修改

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> 以单独的方法关闭连接/结果集/语句,否则会出错。你可以使用如下

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

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

【讨论】:

感谢它的工作.. 只是我需要在调用时在 2 个地方使用 next()

以上是关于我在尝试从其他方法访问此返回的 resultSetCustomer. 时收到错误“java.sql.SQLException:结果集结束后”的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JDBC ResultSet 中获取列数?

循环遍历数据库 ResultSet

resultset.last() 在 java 中抛出异常

无法从 Java ResultSet 访问数据 [重复]

PSQLException:此 ResultSet 已关闭

getGeneratedKeys在executeBatch之后返回空ResultSet