如何在特定事件上执行更新?

时间:2018-08-04 06:18:18

标签: java mysql jsp jdbc

我正在尝试执行更新:

如果当前时间晚于拍卖结束时间(即无效),则将表status的{​​{1}}列设置为auctions。否则,请设置为“ 1”。

0

我一直收到此错误。

  

javax.servlet.ServletException:java.sql.SQLException:操作不正确   ResultSet关闭后允许使用

我该如何解决类似问题?

2 个答案:

答案 0 :(得分:1)

您甚至不需要在此处进行选择,您可以执行一条更新语句:

UPDATE auctions
SET status = CASE WHEN enddatetime < NOW()
                  THEN 'inactive'
                  ELSE 'active' END
WHERE aucID = <some ID>;

但是,我通常建议不要使用这种方法,因为活动/不活动标签是派生数据,可能不会插入。相反,您可能被迫多次运行此更新,这不是最佳选择。相反,您可以在需要时选择此标签。

您得到的确切错误是由于在关闭ResultSet之后尝试使用它。我的建议应消除这种情况,因为这样一来,您只需要更新一次即可:

String sql = "UPDATE auctions SET status = CASE WHEN enddatetime < NOW() ";
sql += "THEN 'inactive' ELSE 'active' END WHERE aucID = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, 123);
ps.executeUpdate();

答案 1 :(得分:0)

在使用executeUpdate()之后尝试使用ResultSet。将auctionID分配给ArrayList,然后对其进行迭代。

ArrayList<Integer> inactiveIDs = new ArrayList(), activeIDs = new ArrayList();

while(rs.next()){

    ... 

    if(current.after(end)){
        System.out.println("Inactive");
        inactiveIDs.add(auctionID);
    }else{
        System.out.println("Active");
        activeIDs.add(auctionID);
    } 
}

for(Integer auctionID: inactiveIDs){
    st.executeUpdate("UPDATE auctions SET status='inactive' WHERE aucID=" + auctionID);
}

for(Integer auctionID: activeIDs){
    st.executeUpdate("UPDATE auctions SET status='active' WHERE aucID=" + auctionID);
}