java.sql.SQLException: Exhausted Resultset

24

我运行一条针对Oracle数据库的查询时,出现了错误java.sql.SQLException: Exhausted ResultSet。连接是通过在Websphere中定义的连接池进行的。执行的代码如下:

if (rs! = null) (
    while (rs.next ()) (
        count = rs.getInt (1);
    )
)

我注意到结果集包含数据(rs.next())

谢谢


在读取结果集时,该语句或连接是否已关闭? - Arne Burmeister
2
@Arne:这更可能会抛出一个“SQLException: ResultSet is closed”的异常。 - BalusC
7
将来,请添加堆栈跟踪并指出代码的行数。看到已接受的答案,抛出异常的行号绝对不在您在问题中发布的代码中。您应该多练习解读堆栈跟踪。我删除了我的答案。 - BalusC
1
是的,这个问题绝对不在代码中,因为我已经想到了 :-) 我一直看到这个错误都是由同样的问题引起的。 - sourcerebels
9个回答

36

在处理结果集后尝试访问列值时,我看到了这个错误。

if (rs != null) {
  while (rs.next()) {
    count = rs.getInt(1);
  }
  count = rs.getInt(1); //this will throw Exhausted resultset
}

希望这能对你有所帮助 :)


Simple and Clear, Thanks - The Guest
它是否会为其他数据库(如mysql、sql server等)创建相同的异常? - Ajay Jayavarapu
我不知道。可能是的。我猜这取决于数据库供应商 :-) - sourcerebels
1
不允许在“!=”之间有空格 :) - Muhammad Suleman
谢谢。我改了我的答案。 - sourcerebels

4

试试这个:

if (rs != null && rs.first()) {
    do {
        count = rs.getInt(1);
    } while (rs.next());
}

3

如果您使用 rs.absolute(1) 将结果集重置为顶部,您将不会得到耗尽的结果集。

while (rs.next) {
    System.out.println(rs.getString(1));
}
rs.absolute(1);
System.out.println(rs.getString(1));

您可以使用rs.first()代替rs.absolute(1),它们的作用是相同的。

2

当数据库没有返回特定条件的记录时,当我尝试访问rs.getString(1);时,会出现"exhausted resultset"错误。

在出现问题之前,我的代码是:

rs.next();
sNr= rs.getString(1);

修复后:

while (rs.next()) {
    sNr = rs.getString(1);
}

2

当 ResultSet 在 while 循环之外使用时,会出现此异常。请将所有与 ResultSet 相关的处理都放在 While 循环内部。


1
错误背后的问题: 如果您正在尝试访问Oracle数据库,则在事务成功之前将无法访问插入的数据,要完成事务,必须在将数据插入表后触发commit查询。因为Oracle数据库默认情况下不处于自动提交模式。

解决方案:

进入SQL PLUS并按照以下查询操作..

SQL*Plus: Release 11.2.0.1.0 Production on Tue Nov 28 15:29:43 2017

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

Enter user-name: scott
Enter password:

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> desc empdetails;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ENO                                                NUMBER(38)
 ENAME                                              VARCHAR2(20)
 SAL                                                FLOAT(126)

SQL> insert into empdetails values(1010,'John',45000.00);

1 row created.

SQL> commit;

Commit complete.

1

通常在重复使用stmt但期望不同的ResultSet时会出现这种情况,请尝试创建一个新的stmt并执行executeQuery。这对我有帮助!


0
请确保 res.getInt(1) 不为 null。 如果可能为空,请使用 Integer count = null; 而不是 int count =0;
Integer count = null;
    if (rs! = null) (
                    while (rs.next ()) (
                        count = rs.getInt (1);
                    )
                )

0
您会遇到此错误是因为在 resultSet.next() 方法之前使用了 resultSet。要获取计数,只需使用以下代码:

while (rs.next ()) `{ count = rs.getInt (1); }

这样就可以得到您想要的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接