Java ResultSet未正确定位,我不知道在何处调用next()

Java ResultSet未正确定位,我不知道在何处调用next(),java,sql,jdbc,Java,Sql,Jdbc,我见过很多这样的问题,但没有一个有我需要的答案。 我已经创建了一个准备好的语句,它将更新我的表票据。现在,对于buyTickets方法,我给出了CustomerId knr、PerformanceIdaid和Ticekts购买NZTickets的参数。我必须循环我的查询,对于每一张通缉票的票号,我必须调用预先准备好的声明。但是我得到一个错误,它说ResultSet没有正确定位。我真的不确定在哪里以及如何调用next,以便在每一行中执行preparedStatement?这是我的密码: publ

我见过很多这样的问题,但没有一个有我需要的答案。 我已经创建了一个准备好的语句,它将更新我的表票据。现在,对于buyTickets方法,我给出了CustomerId knr、PerformanceIdaid和Ticekts购买NZTickets的参数。我必须循环我的查询,对于每一张通缉票的票号,我必须调用预先准备好的声明。但是我得到一个错误,它说ResultSet没有正确定位。我真的不确定在哪里以及如何调用next,以便在每一行中执行preparedStatement?这是我的密码:

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