测试两个result.next()

Csi*_*Csi -1 java database oracle jdbc resultset

我需要帮助才能知道为什么我的一份准备好的陈述没有被执行.这是代码:

准备好的声明:

updaterBalance = connection.prepareStatement("UPDATE accounts SET balance = ? WHERE account_id = ?")
Run Code Online (Sandbox Code Playgroud)

桌子 :

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)");
Run Code Online (Sandbox Code Playgroud)

失败的方法:

 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;
    }
Run Code Online (Sandbox Code Playgroud)

}

电话:

 boolean a = manager.transfer(1, 2, 10);
Run Code Online (Sandbox Code Playgroud)

准备好的语句完全正常是一个addMoney方法,可以在单个指定的account_id上添加资金.在通话时,第一个account_id的余额为1000,第二个为0.我从未进入过if块.我根本无法满足条件.

任何的想法 ?

Rea*_*tic 6

对文件Statement说:

默认情况下,ResultSet每个Statement对象只能同时打开一个对象.因此,如果一个ResultSet对象的读取与另一个对象的读取交错,则每个Statement对象必须由不同的对象生成.如果存在打开StatementResultSet对象,则接口中的所有执行方法都会隐式关闭该属性的当前对象.

这基本上意味着,因为你使用了相同的lookForAccount两个语句resultresult2,result被关闭,所以result.next()不会返回true.