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

for循环中的java mysql结果集错误

酆阳煦
2023-03-14

在下面的代码:

String GET_DISTINCT_LISTENER_IDS_QUERY = "select distinct(listener_id) from ";
ResultSet rs = null;
ResultSet rs2 = null;
String temp_table = "CREATE TABLE IF NOT EXISTS temp (id INT NOT NULL COMMENT '',"
        + "date_start DATETIME NULL COMMENT ''," + "listener_id VARCHAR(45) NULL COMMENT '',"
        + "gateway_id VARCHAR(45) NULL COMMENT ''," + "entryway_id VARCHAR(45) NULL COMMENT '')";

stmt.executeUpdate(temp_table);

for (int i = 0; i < table_names_list.length; i++) {
    GET_DISTINCT_LISTENER_IDS_QUERY += table_names_list[i];
    PreparedStatement ps1 = conn.prepareStatement(GET_DISTINCT_LISTENER_IDS_QUERY);
    rs = ps1.executeQuery();

    while (rs.next()) {
        String query = "Select * from " + table_names_list[i] + " where listener_id = ? order by date_start LIMIT 1";
        PreparedStatement ps2 = conn.prepareStatement(query);
        ps2.setString(1, rs.getString("listener_id"));
        rs2 = ps2.executeQuery();
        String temp_insert = "INSERT INTO " + table_names_list[i]
                + " (id, date_start, listener_id, gateway_id, entryway_id)" + " values(?,?,?,?,?)";
        PreparedStatement ps = conn.prepareStatement(temp_insert);
        while (rs2.next()) {
            ps.setInt(1, rs2.getInt("id"));
            ps.setDate(2, rs2.getDate("date_start"));
            ps.setString(3, rs2.getString("listener_id"));
            ps.setString(4, rs2.getString("gateway_id"));
            ps.setString(5, rs2.getString("entryway_id"));
            System.out.println("Updating statement...");
            ps.executeUpdate();
            System.out.println("Record is inserted into DBUSER table!");
        }
    }
}

在上面的代码中,我从用户那里得到一个表名列表,然后在for循环中对它们进行迭代。代码正在工作,但它没有将数据插入临时表并以错误结束。

错误:

java.sql.SQLException: Operation not allowed after ResultSet closed
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
    at com.mysql.jdbc.ResultSet.checkClosed(ResultSet.java:666)
    at com.mysql.jdbc.ResultSet.next(ResultSet.java:7274)
    at database.database.main(database.java:62)

62: while (rs.next()) { (this line number 62)

请帮我找出为什么会出现这个错误?

共有2个答案

廖弘量
2023-03-14

当您运行rs2=stmt时。执行(查询) 上一个resultsetrs关闭。更多细节可以在这里找到

柳胜
2023-03-14

ResultSet rs引用取决于生成它的语句stmt引用。由于要将语句更改为在stmt中执行,rs将在后台关闭,无法再工作。

要解决此问题,只需为每个rsrs2使用一个PreparedStatement

 类似资料:
  • 问题内容: 我正在尝试在MySQL中编写一个存储过程,该存储过程将执行一个稍微简单的选择查询,然后循环遍历结果,以便决定是执行其他查询,数据转换还是完全丢弃数据。有效地,我想实现这一点: 只有,我只希望在MySQL中使用它,因此可以将其称为过程。我知道对于触发器来说,有语法,但是找不到在语法之外使用的类似内容。我已经阅读了MySQL中的一些循环机制,但到目前为止,我所能想象的就是我将实现以下内容:

  • 和C语言不同的的是 和if一样,条件表达式的值必须是布尔类型 和if一样,不需要编写圆括号 和if一样,左大括号必须和表达式在同一行 格式: for 初始化表达式;循环条件表达式;循环后的操作表达式 { 循环体语句; } package main import "fmt" func main() { for i:=0; i<10; i++{ fmt.Println(i

  • 我正在编写一个计算e^x值的方法。我在python中实现它的方式如下。 这将很好地返回e^x的值。但是,当我尝试在c#中实现相同的方法时,它没有输出与python中相同的值。以下是c#中的实现。 起初,这段代码的输出是一个无穷大符号。为了解决这个问题,我只是减少了循环运行的次数。在c#中,循环只运行10次,代码的输出非常接近于python中循环运行100次的输出。我的问题是,在不同的编程语言中,两

  • 这个问题应该很简单,而且可能会让人恼火,但我仍然对使用Java关闭结果集感到怀疑。每个语句都应该这样做,或者结果集应该只在final中关闭?

  • 我试图在for循环中获得for循环,因此输出如下: 我希望输出显示一个正方形 我不知道它为什么不这样做。下面是我的代码:

  • 我在研究mysqli准备的声明,我有两个问题。 在阅读过程中,我发现预处理语句的执行顺序如下所示: 这是我的第一个问题: 在我阅读时,它还提到以下内容: 如果不将结果绑定到变量,请使用$row=$stmt- 他们使用这两种方法中的任何一种来循环结果集是否有任何优点/缺点?如果没有区别,那么为什么还要麻烦使用$stmt绑定结果呢- 这是我的另一个问题: $stmt- 希望你的回答能让我更好地理解事先