繁体   English   中英

ExecuteQuery返回null,而execute语句返回true

[英]ExecuteQuery returns null while execute statement returns true

这是我的Java代码,试图从数据库获取ResultSet。

    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());
    }

当我尝试运行此命令时,无法使用executeQuery语句在rs处获取结果集。 当我尝试使用execute语句execute它返回true ,这意味着将返回某些结果集。 为什么我的executeQuery返回null。

我试图运行的SQL查询是

选择*从SCHEDULED_PROGRAM_ID =的应用程序?

在sql管理器中执行时,此查询运行良好并获取结果。

你能告诉我我做错了吗。

在所示的代码中,如果rs1为false,则rs只能为null ,这仅在您执行不产生结果集的东西(或者JDBC驱动程序有bug,但可能性较小)时才是这种情况。 。

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

execute方法返回一个boolean以指示第一个结果的形式。 您必须调用方法getResultSetgetUpdateCount来检索结果。 您必须调用getMoreResults才能移至任何后续结果。

但是,如果您知道要执行的查询会生成一个结果集(即使它为空,select也会始终生成一个结果集!),则应使用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());
}

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

rs = ps.executeQuery();
while (rs.next()) {
    // process the row returned by next()
    // e.g.,
    System.out.println(rs.getString(1));
}

您想念您的读者。 它必须类似于:while(rs1.read())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM