当前位置: 首页 > 知识库问答 >
问题:

如何对特定事件执行更新?

薛朝
2023-03-14

我正在尝试执行一个更新,内容如下:

如果当前时间晚于拍卖结束时间(即非活动),则将表拍卖状态列设置为0。否则,设置为“1”。

rs = st.executeQuery("select * from auctions");
System.out.println("### TESTING DATETIMES ####");
while(rs.next()){
    Timestamp start = rs.getTimestamp("startdatetime");
    Timestamp current = Timestamp.valueOf(LocalDateTime.now().format(formatter));
    Timestamp end = rs.getTimestamp("enddatetime");

    int auctionID = rs.getInt("aucID");

    System.out.println(start);
    System.out.println(current);
    System.out.println(end);

    boolean inactive = current.after(end);
    System.out.println(inactive);

    if(current.after(end)){
        System.out.println("Inactive");
        st.executeUpdate("UPDATE auctions SET status='inactive' WHERE aucID=" + auctionID);
    }else{
        System.out.println("Active");
        st.executeUpdate("UPDATE auctions SET status='active' WHERE aucID=" + auctionID);
    } 
}

我一直在犯这个错误。。

javax。servlet。ServletException:java。sql。SQLException:结果集关闭后不允许操作

我怎么去修理这样的东西?

共有2个答案

凌嘉志
2023-03-14

尝试使用ResultSet后使用执行更新()。将拍卖ID分配给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);
}
宗啸
2023-03-14

您甚至不需要在此处执行select,您可以执行单个update语句:

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();
 类似资料:
  • 我试图弄清楚是否有可能在<代码> 更具体地说,我有几个多模块项目继承了我们公司范围内的母公司pom。在<代码> 在对一个儿童项目进行了数小时的实验后,我想: 避免在所有模块中执行不必要的拷贝回写,当我在父POM中定义执行拷贝回写时会发生这种情况,并且有在所有模块中创建目标文件夹层次结构的缺点 避免在父POM中未定义执行的情况下,在需要的所有模块中的多个克隆副本中定义执行 一个示例子项目包含以下模块

  • 问题内容: 我一直在尝试更新特定行已有一段时间了,看来有两种方法可以做到这一点。根据我的阅读和尝试,你可以使用: 方法 或者: 方法。 (让我知道这是否不正确,因为我是android新手,还是SQL新手。) 因此,让我了解我的实际代码。 我正在努力做到这一点: 更新主键()等于1的Field1,Field2和Field3。 Eclipse在“更新”一词的正下方给了我一条红线,并给出了以下解释: S

  • 问题内容: 我在src / test / resources / feature /中有以下功能文件(单独的功能文件),我想并行运行它们。就像:一个功能文件必须在chrome中执行,而另一个功能文件必须在firefox中执行,如@Tags名称所述。 有人可以帮助我实现这一点吗?我使用的是cumul-java 1.2.2版本,并且使用AbstractTestNGCucumberTests作为运行程序

  • 我将JRE7与Apache POI3.7一起使用。有人能帮我用事件API获得特定的行吗?

  • 问题内容: 我正在为jQuery日期选择器插件创建AngularJS指令,当日期选择器日期更改时,该插件应更新ng-model。 这是到目前为止的代码: 考虑到在调用事件时范围,元素,属性,ngModel不可用,如何在“ dp.change”事件中更新ngModel? 谢谢! 问题答案: 可以肯定的是,已添加到angular的任何插件都不会更新angular范围的,我们需要在它的jquery ch

  • 问题内容: 给出: 给出: 是否有准备使用的库/代码来完成它? 问题答案: 您将无法使用JSON.stringify序列化事件对象,因为事件对象包含对DOM节点的引用,并且DOM在各处都有循环引用(例如,子/父关系)。JSON默认情况下无法处理这些,因此您有点不走运。