executeQuery Mysql 中的 ResultSet 为 false - Java 即使行存在

Posted

技术标签:

【中文标题】executeQuery Mysql 中的 ResultSet 为 false - Java 即使行存在【英文标题】:ResultSet is false in executeQuery Mysql - Java even when row exist 【发布时间】:2014-01-11 22:29:37 【问题描述】:

我正在使用 Java 中的 PreparedStatement 从 mysql 的表中获取两列。如果我直接在 mySql DB 上执行查询,则该查询有效并返回行。但是对于此方法调用,ResultSet 在每个 ResultSet.next() 调用上都有值“false”。下面是代码:

private ResultSet fetchFriends(int lActProfId) throws SQLException 
        // TODO Auto-generated method stub
        String selectRelationQry= "SELECT friend_id, type FROM fs_relationship WHERE profile_id =?";
        System.out.println("---- In method FetchAndInsertInWall()->fetchFriends - Qry: "+selectRelationQry);
        pst = lCon.prepareStatement(selectRelationQry);
        pst.setInt(1, lActProfId);
        System.out.println("lActProfId: "+ lActProfId );
        ResultSet res3 = pst.executeQuery();
        System.out.println("---- temp--- In method FetchAndInsertInWall()->fetchFriends query has no Results");
        if(!res3.next())
            System.out.println("---- In method FetchAndInsertInWall()->fetchFriends query has no Results");
         else System.out.println("Elements in res3: "+res3.next() +  res3.next() + res3.next());
        
        pst = null;
        return res3;
    

我在控制台上得到以下输出:

---- In method FetchAndInsertInWall()->fetchFriends - Qry: SELECT friend_id, type FROM fs_relationship WHERE profile_id =?
lActProfId: 5002
---- temp--- In method FetchAndInsertInWall()->fetchFriends query has no Results
Element in res31: false
----> WallInsertions Failed for Uid: 5002
java.sql.SQLException: Illegal operation on empty result set.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
    at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:855)
    at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2710)
    at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2851)
    at com.fs.javadbact.FetchDataAndInsertInWall.fetchAndInsertInWall(FetchDataAndInsertInWall.java:64)
    at com.fs.javadbact.ConsumerTest.run(ConsumerTest.java:86)
    at java.lang.Thread.run(Unknown Source)
Jan 12, 2014 3:34:57 AM com.fs.javadbact.ConsumerTest run

请帮助我如何解决这个问题并使用正确的数据获得正确的 ResultSet。

【问题讨论】:

你有一个system.out在你问之前说没有结果,而且你在使用.next 3次之后 我没有得到你想要的?!如果您没有任何值,您将无法从您的数据库中获取任何值,最终会通过单击 next() (迭代您的结果)导致错误 如果完全相同的查询,使用相同的参数,在您的数据库浏览工具中返回行,那么这意味着数据库浏览工具正在返回已插入但尚未提交的行,或者该代码没有使用与数据库浏览工具相同的数据库/模式。 res3.next() + res3.next() + res3.next() 是什么意思?该代码没有任何意义。它仅将结果集推进三个 而不实际获取任何数据(另外:您确定您的结果确实包含至少 4 行吗?) 感谢 cmets。对不起,如果我的问题不够清楚。我还处于学习java的阶段,所以代码中可能有一些错误。我想我找到了问题的原因,我在同一个连接中使用了多个 ResultSet。我在同一个连接上尝试了多个preparedStatements,但是当我在获取第二个结果集后访问第一个结果集时它仍然失败。请指导。 【参考方案1】:

我想你忘记在pst 变量之前声明PreparedStatement 写:PreparedStatement pst = lCon.prepareStatement(selectRelationQry); 而不是:

pst = lCon.prepareStatement(selectRelationQry);

【讨论】:

【参考方案2】:

使用 getString() 而不是 next() 来获取行的值。

如果您的结果少于三行,您将耗尽结果集。不知道返回false一次后是否需要next()才能工作。

【讨论】:

以上是关于executeQuery Mysql 中的 ResultSet 为 false - Java 即使行存在的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 executeQuery() 发出数据操作语句

无法使用 executeQuery() 发出数据操作语句 [重复]

java 批量执行sql语句 mysql批量执行sql语句

JDBC操作MySQL中的表

如何从MySQL中将精确的行数加载到jTable并对其余的分页?

ResultSet next方法