Java.sql.SQLException: Exhausted Resultset错误

3

我在以下代码中遇到了java.sql.SQLException: Exhausted Resultset的问题。 我确定我的查询只返回一个值。 即使我不使用rs.next();,它也会抛出错误java.sql.SQLException: ResultSet.next was not called。 你能帮忙吗?

另外,我在主函数中使用了另一个结果集来调用来自另一个类的此方法。 这会产生影响吗?

谢谢

public static String getdispname(Connection conn, String resname) 
throws SQLException, Exception {

            //String resname = "";
            String returnValue = "";
            String querystring = "";

            //Query to select the displayname from resid

            querystring += "select distinct display_name";
            querystring += " from cust_rally_team_member";
            querystring += " where display_name like '%"+ resid +"%'";

            // Create select statement
            Statement stmt = conn.createStatement();

            try {
                // Execute statement
                ResultSet rs = stmt.executeQuery(querystring);
                if (rs!= null) { 
            while (rs.next()) {
            returnValue = rs.getString("display_name");
            } catch (SQLException ex) {
                throw new SQLException(ex);
            } catch (Exception ex) {
                throw new Exception(ex);
            }
            // Close statement
            finally {
                stmt.close();
            }

            return returnValue;

顺便提一下,在finally中关闭的statement,同样不要忘记关闭resultsetconnection。这非常重要。 - Jacob
是的,它提供了预期的一个结果。但是当我将其添加到Java中时,它不会给出结果。当我在查询中将变量%resid%替换为%amit%时,它提供了值。查询字符串是否正确表示? - user2335123
啊,所以resid是一个声明的变量? - Jacob
然后尝试使用 like '%+resid+%'"; - Jacob
找到了正确的语句 '%"+ resid +"%',问题得到解决。 - user2335123
显示剩余4条评论
4个回答

5

尝试如下:

if (rs! = null) { 
 while (rs.next()) {
  returnValue = rs.getString("display_name");
}
......

出现错误 无法编译源代码 - 不兼容的类型 需要: boolean 找到: java.sql.ResultSet - user2335123
对于上面的代码,你应该使用while(rs.hasNext()),因为while期望布尔值,但你传递了rs.next(),它返回结果集,所以不匹配,因此在编译时出错。将其更改为rs.hasNext()。 - Karibasappa G C
java.sql.ResultSet 没有 hasNext() 方法,而 next() 返回一个布尔值。 - Mark Rotteveel
谢谢@Polppan。我使用了你的结果集语句并修改了我的like语句。我按照建议更新了我的代码。 - user2335123
肯定会使用预处理语句。谢谢提示。 - user2335123
显示剩余2条评论

1

尝试:

returnValue = rs.next() ? rs.getString("display_name") : null;

您不需要检查rs是否为空。假设executeQuery()返回而不是引发异常,它不会为空。(尽管返回的结果集可能有0行)。
假设您真的知道只会返回一行,那么您也不需要循环遍历结果集。(尽管考虑到查询,这似乎不太可能。)

0

请按照以下方式进行修改使用

if (rs != null && rs.first()) {
    do {
        returnValue = rs.getString(("display_name");
    } while (rs.next());
}

你的另一个答案的副本:http://stackoverflow.com/a/23219863/466862,仍然是错误的,因为`first()`在调用前向只读结果集时可能会抛出异常。 - Mark Rotteveel

0

我正在使用Oracle 10g数据库,发现了相同的错误“java.sql.SQLException: Exhausted Resultset error”。我只是在数据库中授予权限并解决了我的问题。

SQL> grant insert,update,delete on "table-name" to "database_name";


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