【问题标题】:SQLSTATE 24000 - Invalid Cursor StateSQLSTATE 24000 - 游标状态无效
【发布时间】:2011-04-13 06:38:54
【问题描述】:

我连接到一个 DB2 数据库并进行以下查询。我不明白为什么会出现错误:“无效的游标状态”。

public static void blivPar() {
            try {
                Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_UPDATABLE);
                stmt.setMaxRows(1000);

                ResultSet drenge = stmt.executeQuery("SELECT * FROM People WHERE sex='M'");
                ResultSet piger = stmt.executeQuery("SELECT * FROM People WHERE sex='F'");
                drenge.first();
                piger.first();
                int i=0;
                while(drenge.next()) {
                    while(piger.next()) {
                        i++;
                        System.out.print(i);
                        stmt.execute("INSERT INTO Couples Values ('"+drenge.getString(1) +
                                "','" + drenge.getString(2) +
                                "','" + piger.getString(1) +
                                "','" + piger.getString(2) + "')");
                    }
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }

        }

谢谢。

【问题讨论】:

  • 当您可以使用 SQL 执行此操作时,为什么还要在游标中执行此操作?
  • 你的堆栈跟踪是什么? DB2 抛出的 SQL 代码是什么?

标签: java sql jdbc db2


【解决方案1】:

在语句接口的 JDBC Javadocs 上找到了这个:“用于执行静态 SQL 语句并返回它产生的结果的对象。

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

所以在我看来,如果您希望同时打开两个结果集,您需要两个不同的语句。或者您需要完成第一个 ResultSet 的处理并关闭它,以便重新使用 Statement 来创建第二个 ResultSet。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    相关资源
    最近更新 更多