为了账号安全,请及时绑定邮箱和手机立即绑定

ExecuteQuery 返回 null 而 execute 语句返回 true

ExecuteQuery 返回 null 而 execute 语句返回 true

一只名叫tom的猫 2021-10-28 15:52:55
这是我尝试从 DB 获取 ResultSet 的 java 代码。    try{        ps=conn.prepareStatement(QueryMapper.SCHEDULE_APPLICANT_STATUS);        ps.setString(1,schedule_id);        rs1=ps.execute();        System.out.println(rs1);        ResultSet rs = null;        while(rs1)        {            rs=ps.executeQuery();            System.out.println(rs.next());            Application applicationBean= new Application();            System.out.println("ABC"+schedule_id);            applicationBean.setScheduledProgramId(rs.getString(3));             applicationBean.setStatus(rs.getString(2));             applicationBean.setApplicantId(rs.getString(1));             applicationList.add(applicationBean);            applicationCount++;        }    }catch (SQLException sqlException) {        log.error(sqlException.getMessage());        System.out.println(sqlException.getMessage());    }当我尝试运行它时,我无法在 rs usingexecuteQuery语句中获取结果集。当我尝试执行 usingexecute语句时,它返回了true这意味着返回了一些结果集。为什么我的executeQuery返回为空。我试图运行的 sql 查询是SELECT * FROM APPLICATION WHERE SCHEDULED_PROGRAM_ID=?此查询运行良好并在 sql 管理器中执行时获取结果。你能告诉我哪里做错了。
查看完整描述

3 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

在所示的代码中,rs只能为nullifrs1为假,只有在您执行不产生结果集的事情时才会出现这种情况(或者如果您的 JDBC 驱动程序有错误,但可能性较小)。


不过,你在做什么,毫无意义。如果使用execute(),则不应再次执行查询来获取结果集。这样做效率低下,因为您要求数据库服务器重做它为您所做的第一个工作execute(),请getResultSet()改用。如记录在PreparedStatement.execute():


该execute方法返回 aboolean以指示第一个结果的形式。您必须调用方法getResultSet或 getUpdateCount检索结果;您必须调用 getMoreResults以移动到任何后续结果。


但是,如果您知道您正在执行一个生成结果集的查询(并且选择总是生成一个结果集,即使它是空的!),那么您应该使用executeQuery(). 这简化了您的代码。


您的代码也有一个无限循环。你的意思是用if (rs1)而不是while(rs1)吗?


您应该将代码更改为类似


try (PreparedStatement ps=conn.prepareStatement(QueryMapper.SCHEDULE_APPLICANT_STATUS)) {

    ps.setString(1,schedule_id);

    try (ResultSet rs = ps.executeQuery()) {

        // or maybe if (rs.next())?

        while (rs.next()) { 

            Application applicationBean= new Application();

            System.out.println("ABC"+schedule_id);

            applicationBean.setScheduledProgramId(rs.getString(3)); 

            applicationBean.setStatus(rs.getString(2)); 

            applicationBean.setApplicantId(rs.getString(1)); 

            applicationList.add(applicationBean);

            applicationCount++;

        }

    }

} catch (SQLException sqlException) {

    log.error(sqlException.getMessage());

    System.out.println(sqlException.getMessage());

}


查看完整回答
反对 回复 2021-10-28
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

您不需要两个 ResultSet 对象,您只需要执行 PreparedStatement 一次。典型的模式是:


rs = ps.executeQuery();

while (rs.next()) {

    // process the row returned by next()

    // e.g.,

    System.out.println(rs.getString(1));

}


查看完整回答
反对 回复 2021-10-28
  • 3 回答
  • 0 关注
  • 697 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信