【问题标题】:ResultSet not open. Operation 'moveToInsertRow' not permitted. Verify that autocommit is OFF结果集未打开。不允许操作“moveToInsertRow”。验证自动提交是否关闭
【发布时间】:2014-10-16 08:41:50
【问题描述】:

我遇到了这个错误的问题,当我点击按钮时,它会获取标签的值并将其从数据库中放入表中

void showAll(){
    try{
        rs1 = stmt.executeQuery("SELECT * FROM BORROW_RETURN");
        while(rs1.next())
        {
            String bookpp = rs1.getString("name");
            String emailse = rs1.getString("email");
            String booktee = rs1.getString("book_title");
            String ser_no = rs1.getString("serial_no");
            String borr = rs1.getString("borrowed");
            String ret = rs1.getString("return");
            loginModel3.addRow(new Object[]{bookpp, emailse, booktee, ser_no, borr, ret});
        }}catch(SQLException err){
            System.out.print(err);
    }
}

这是连接到数据库的连接

void DoConnect1( ) {
               try{
                String host = "jdbc:derby://localhost:1527/Dafuq7";
                String uName ="Dafuq7";
                String uPass ="Dafuq7";
                con = DriverManager.getConnection(host, uName, uPass);

                //EXECUTE SOME SQL AND LOAD THE RECORDS INTO THE RESULTSET
                    stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 
                    ResultSet.CONCUR_UPDATABLE);
                String sql = "SELECT * FROM borrow_return";
                rs1 = stmt.executeQuery(sql);

                   }


    catch (SQLException err) {
        System.out.println(err.getMessage() );
    }
}

点击按钮后出现上述错误,

private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {                                         
   String ema = jLabel20.getText();
    String enm = jLabel21.getText();
    String booknm = bttl.getText();
    String snnnn = sernum.getText();
    dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    String dates = dateFormat.format(date_borr.getDate());
    try {

        rs1.moveToInsertRow();
        rs1.updateString( "book_title", booknm );
        rs1.updateString( "serial_no", snnnn );
        rs1.updateString( "name", enm );
        rs1.updateString( "email", ema );
        rs1.updateString( "borrowed", dates );
        JOptionPane.showMessageDialog(null, "HAHA");
        loginModel3.addRow(new Object[]{names, booknm, snnnn, enm, ema, dates});

        con.setAutoCommit(false);
System.out.println(con.getAutoCommit());
rs1.insertRow( );
        stmt.close();
        rs1.close();

        stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
        String sql = "SELECT * FROM accounts";

        rs1 = stmt.executeQuery(sql);
        }
    catch (SQLException err) {
        System.out.println(err.getMessage() );
    }
}

【问题讨论】:

  • 我还是有错误
  • 您应该在创建连接后立即关闭自动提交。不要等到您已经发出查询;到那时为时已晚,因为您的查询已经自动提交。
  • 拜托,你能具体说明一下放在哪里吗,我现在不知道该怎么做,我正在寻找几天来找到解决方案。可以吗。

标签: java jdbc derby


【解决方案1】:

在真正提交查询后,您将 autoCommit 设置为 false。您需要在打开连接后或开始执行查询之前将其设置为 false。

        con = DriverManager.getConnection(host, uName, uPass);
        //EXECUTE SOME SQL AND LOAD THE RECORDS INTO THE RESULTSET
        stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 
        ResultSet.CONCUR_UPDATABLE);
        String sql = "SELECT * FROM borrow_return";
        con.setAutoCommit(false);
        rs1 = stmt.executeQuery(sql);

【讨论】:

    【解决方案2】:

    https://codedump.io/share/WK0Jtw7GEH3h/1/why-do-i-get-javasqlsqlexception-resultset-not-open-operation-39next39-not-permitted-java-derby-database

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多