【问题标题】:JDBC : Operation not allowed after ResultSet closed [duplicate]JDBC:ResultSet关闭后不允许操作[重复]
【发布时间】:2018-10-08 22:07:33
【问题描述】:

单击按钮时,此代码显示此错误消息:

结果集关闭后不允许操作

代码:

case 4:
                BufferedReader choosest=new BufferedReader(new InputStreamReader(System.in));
                System.out.print("enter your id");
                int idst=Integer.parseInt(choosest.readLine());
                String SQL = "SELECT * FROM student";
                ResultSet ps = stmt.executeQuery(SQL);
                while (ps.next()) {
                    int iddb = ps.getInt("id");
                if(idst==iddb) {
                    BufferedReader lessonuser = new BufferedReader(new InputStreamReader(System.in));
                    System.out.print("choose lesson ");
                    String lest =lessonuser .readLine();
                    String SQL1 = "SELECT * FROM lesson";
                    ResultSet qs = stmt.executeQuery(SQL1);
                    while (qs.next()) {
                        String ledb = ps.getString("namel");
                        if (lest == ledb) {
                            String insertTableSQL1 ="INSERT INTO chooselesson (id, lesson)  VALUES ("+idst+",'"+lest+"')";
                            stmt.executeUpdate(insertTableSQL1);
                            System.out.print("your unit sucssesfully add ");

                        }
                        }

                    }
                    }

【问题讨论】:

标签: java mysql jdbc


【解决方案1】:

ResultSet 在您进行另一个查询时关闭。对于此代码,您可以先收集ps 的所有数据。然后迭代结果以执行其他查询。

我不得不说在循环中进行查询是糟糕的性能操作。有很多方法可以避免这种情况。例如,您可以在一个查询中获取所有学生记录以及所有课程记录。然后使用lessonuser找出你应该在chooselesson表中插入哪些记录,并以批处理模式运行insert SQL。

【讨论】:

  • 谢谢。你有什么建议解决它吗?
【解决方案2】:

问题出在一线 结果集 qs = stmt.executeQuery(SQL1); .Using 语句执行其他查询会关闭之前的 ResultSet。修改上面的代码可能可行,我没有测试解决方案,但它应该可以正常工作。

BufferedReader choosest=new BufferedReader(new InputStreamReader(System.in));
            System.out.print("enter your id");
            int idst=Integer.parseInt(choosest.readLine());
            String SQL = "SELECT * FROM student";
            ResultSet ps = stmt.executeQuery(SQL);
            while (ps.next()) {
                int iddb = ps.getInt("id");
            if(idst==iddb) {
                BufferedReader lessonuser = new BufferedReader(new InputStreamReader(System.in));
                System.out.print("choose lesson ");
                String lest =lessonuser .readLine();
                String SQL1 = "SELECT * FROM lesson";
                ResultSet qs = stmtSelect.executeQuery(SQL1);
                while (qs.next()) {
                    String ledb = ps.getString("namel");
                    if (lest == ledb) {
                        String insertTableSQL1 ="INSERT INTO chooselesson (id, lesson)  VALUES ("+idst+",'"+lest+"')";
                        stmtInsert.executeUpdate(insertTableSQL1);
                        System.out.print("your unit sucssesfully add ");

                    }
                    }

                }
                }

PreparedStatement 是性能更好的选择,https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

【讨论】:

    猜你喜欢
    • 2013-03-23
    • 2012-03-06
    • 2012-06-11
    • 2011-12-01
    • 2017-04-17
    • 2018-03-20
    • 1970-01-01
    相关资源
    最近更新 更多