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());
}
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));
}
添加回答
举报