测试两个result.next()



我需要帮助来了解为什么我的一个准备好的语句没有被执行。下面是代码:

准备好的语句:

updaterBalance = connection.prepareStatement("UPDATE accounts SET balance = ? WHERE account_id = ?")

table:

statmnt.executeUpdate("CREATE TABLE accounts ( account_id INTEGER, balance DOUBLE PRECISION)");
statmnt.executeUpdate("ALTER TABLE accounts ADD CONSTRAINT balance_must_be_positive CHECK (balance >= 0)");

失败的方法:

 public boolean transfer(int from, int to, double amount) throws DataStoreException {
  try {
    lookForAccount.setInt(1, to);
    ResultSet result = lookForAccount.executeQuery();
            if(result.next()) {
                result.close();
                lookForAccount.setInt(1, from);
                ResultSet result2 = lookForAccount.executeQuery();

                if(result2.next()) {
                    updaterBalance.setDouble(1, result2.getDouble("balance") - amount);
                    updaterBalance.setInt(2, from);
                    updaterBalance.executeUpdate();
                    result2.close();
                    updaterBalance.setDouble(1, result2.getDouble("balance") + amount);
                    updaterBalance.setInt(2, to);
                    updaterBalance.executeUpdate();
                    return true;
                }
                else {
                   return false;
                }
            }
            else {
                return false;
            }
          } catch (Exception error) {
        error.printStackTrace();
                return false;
    }

}

调用:

 boolean a = manager.transfer(1, 2, 10);

准备好的语句是一个addMoney方法,它在单个指定的account_id上添加钱。在调用时,第一个account_id的余额为1000,第二个account_id的余额为0。我从来没去过if区。我根本无法满足这些条件。

Statement的文档说:

默认情况下,每个Statement对象只能打开一个ResultSet对象同时。因此,如果一个ResultSet对象的读数为与另一个读数交织在一起,每一个都必须是生成的不同的Statement对象。Statement .中的所有执行方法接口隐式关闭语句的当前ResultSet对象

这基本上意味着因为您对resultresult2使用了相同的lookForAccount语句,所以result正在关闭,因此result.next()将不会返回true

最新更新