Java ResultSet未正确定位,我不知道在何处调用next()
我见过很多这样的问题,但没有一个有我需要的答案。 我已经创建了一个准备好的语句,它将更新我的表票据。现在,对于buyTickets方法,我给出了CustomerId knr、PerformanceIdaid和Ticekts购买NZTickets的参数。我必须循环我的查询,对于每一张通缉票的票号,我必须调用预先准备好的声明。但是我得到一个错误,它说ResultSet没有正确定位。我真的不确定在哪里以及如何调用next,以便在每一行中执行preparedStatement?这是我的密码:Java ResultSet未正确定位,我不知道在何处调用next(),java,sql,jdbc,Java,Sql,Jdbc,我见过很多这样的问题,但没有一个有我需要的答案。 我已经创建了一个准备好的语句,它将更新我的表票据。现在,对于buyTickets方法,我给出了CustomerId knr、PerformanceIdaid和Ticekts购买NZTickets的参数。我必须循环我的查询,对于每一张通缉票的票号,我必须调用预先准备好的声明。但是我得到一个错误,它说ResultSet没有正确定位。我真的不确定在哪里以及如何调用next,以便在每一行中执行preparedStatement?这是我的密码: publ
public void prepareStatements() throws SQLException {
try {
pstmt_updateTicket = connection.prepareStatement("UPDATE Ticket SET kunde = ? WHERE tid = ? AND auffuehrung = ?");
} catch (SQLException ex) {
Logger.getLogger(Szenario1.class.getName()).log(Level.SEVERE, null, ex);
}
}
这是我准备好的声明,这是我的购票方法:
public double buyTickets(int knr, int aid, int anzTickets) throws Exception {
double newgesamtpreis = 0;
Statement stmt = connection.createStatement();
PreparedStatement pstmt = pstmt_updateTicket;
try {
int anzT = anzTickets;
int freiTickets = 0;
ResultSet rs = stmt.executeQuery("SELECT tid, count(tid) FROM Ticket WHERE kunde IS NULL GROUP BY tid;");
if (anzT > freiTickets) {
throw new Exception("Es gibt nicht so viele frei Tickets");
} else {
for (int i = 0; i < anzT; i++) {
pstmt.setInt(1, knr);
pstmt.setInt(2, rs.getInt(1));
pstmt.setInt(3, aid);
pstmt.executeUpdate();
rs.next();
}
}
ResultSet rs3 = stmt.executeQuery("SELECT SUM(preis) FROM Ticket WHERE kunde IS NOT NULL");
newgesamtpreis = rs3.getDouble(1);
} catch (Exception ex) {
Logger.getLogger(Szenario1.class.getName()).log(Level.SEVERE, null, ex);
} finally {
stmt.close();
pstmt.close();
}
return newgesamtpreis;
}
第一次创建结果集时,结果集位于第一行数据之前。要迭代结果集,需要调用first rs.next。 rs.next使您进入结果集的下一行: 如果rs.next成功检索到下一行,则返回true 如果结果集没有更多行,rs.next将返回false 因此,当使用if rs.next或while rs.next时,仅当结果集有另一行要检索时,才会定位结果集。就像它只在一个方法中给出了两个方法rs.hasNext和rs.goNext一样 试试这个:
或者每次在迭代结果集之前打电话给rs.next,请解释一下你的答案,否则这对以后访问这个有类似问题的网站没有帮助。这个答案更好吗?尝试用简单的词解释它小错误,您声明rs.next返回true,如果您的结果集没有刚才编辑的next值,那么我应该调用rs.next作为for循环中的第一个语句?我想知道您想要通过检查anzT>Freitckets实现什么。我想freiTickets的意思是免费票。在该检查之前,您正在将freiTickets设置为0。按照它写的方式,从来没有免费的票……在第一张之前,我有一个查询,检查有多少票是免费的。我删除了它,因为我认为它与问题无关。旁注:如果你在一家更大的公司或国际公司工作,即使是在大多数公司,也需要所有东西都用英语:变量名、类名、文档、,表/列名等,这也会使我们更容易理解您想要实现的目标。对于此类问题,发布一篇文章很重要。如果你剪掉了一些东西,请确保它不会改变函数的行为,否则像我这样的人会停下来说你的函数不能正常工作。如果你为了最小化而剪掉类似的东西,添加一条代码注释,简要解释你剪掉的东西。除了注释1,我认为这段代码是最小的、完整的和可验证的。我认为这个If声明对于理解这个问题甚至是不必要的。如果有别的办法就行了。问题是resultSet
public double buyTickets(int knr, int aid, int anzTickets) throws Exception {
double newgesamtpreis = 0;
Statement stmt = connection.createStatement();
PreparedStatement pstmt = pstmt_updateTicket;
try {
int anzT = anzTickets;
int freiTickets = 0;
ResultSet rs = stmt.executeQuery("SELECT tid, count(tid) FROM Ticket WHERE kunde IS NULL GROUP BY tid;");
while(rs.next()){
if (anzT > freiTickets) {
throw new Exception("Es gibt nicht so viele frei Tickets");
} else {
for (int i = 0; i < anzT; i++) {
pstmt.setInt(1, knr);
pstmt.setInt(2, rs.getInt(1));
pstmt.setInt(3, aid);
pstmt.executeUpdate();
}
}
ResultSet rs3 = stmt.executeQuery("SELECT SUM(preis) FROM Ticket WHERE kunde IS NOT NULL");
if (rs3.next())
newgesamtpreis = rs3.getDouble(1);
}
} catch (Exception ex) {
Logger.getLogger(Szenario1.class.getName()).log(Level.SEVERE, null, ex);
} finally {
stmt.close();
pstmt.close();
}
return newgesamtpreis;
}