当前位置: 首页 > 面试题库 >

关闭ResultSet后不允许进行操作(mysql,java)

须鸿祯
2023-03-14
问题内容

我被错误卡住了,这里的第42行是while(rs.next()){,请帮我解决这个问题,我在这里待了几个小时。

> Exception in thread "main" java.sql.SQLException: Operation not allowed after ResultSet closed
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:937)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:872)
    at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:740)
    at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:6326)
    at removeStopwords.RemoveStopwords.main(RemoveStopwords.java:42)

这是我的代码:

package removeStopwords;

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.StringTokenizer;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;

public class RemoveStopwords {

    // JDBC driver name and database URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost/mydbv2";

    // Database credentials
    static final String USER = "root";
    static final String PASS = "***";

    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        Connection conn = null;
        Statement stmt = null;

        Class.forName("com.mysql.jdbc.Driver");

        conn = (Connection) DriverManager.getConnection(DB_URL, USER, PASS);

        stmt = (Statement) conn.createStatement();
        String sql;
        ResultSet rs = null;
        ResultSet rs2 = null;
        ResultSet rs3 = null;
        java.sql.PreparedStatement ps = null;
        int event_id = 10;
        sql = "SELECT id,text from tweet where event_id = " + event_id;
        rs = stmt.executeQuery(sql);

        String text = "";
        Long id;
        while (rs.next()) {
            id = rs.getLong("id");
            text = rs.getString("text");
            System.out.println("tweet = " + text);
            text = text.replaceAll("http[^\\s]+", "");
            text = text.replaceAll("www[^\\s]+", "");
            System.out.println("tweet after removal of links= " + text);

            StringTokenizer st = new StringTokenizer(text);
            while (st.hasMoreTokens()) {
                String stopword = st.nextToken();
                System.out.println("stopword : " + stopword);

                sql = "SELECT * from stopwords WHERE word =" + '"'+stopword+'"';
                rs2 = stmt.executeQuery(sql);
                if (rs2.next()) {
                    text = text.replaceAll(stopword, "");
                    System.out.println("tweet after removing stopword = " + text);
                }
                sql = "SELECT * from filtertweet where tweet_id = " + id + "";
                rs3 = stmt.executeQuery(sql);
                if (!rs3.next()) {
                    sql = "INSERT INTO filtertweet VALUES(?,?)";
                    ps = conn.prepareStatement(sql);
                    ps.setLong(1, id);
                    ps.setString(2, text);
                    ps.executeUpdate();
                }

            }
        }
        stmt.close();
        conn.close();
    }

}

问题答案:

一个Statement对象只能具有一个active对象ResultSet,因此在执行时rs2 = stmt.executeQuery(sql),第一个ResultSet(rs)被关闭。

创建两个Statement对象,一个用于rs,另一个用于rs2

引用以下内容的javadoc
Statement

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



 类似资料:
  • 问题内容: 我被错误卡住了,这里的第42行是,请帮我解决这个问题,我在这个问题上待了几个小时。 这是我的代码: 问题答案: 一个对象只能有一个active对象,因此在执行时,第一个ResultSet()被关闭。 创建两个对象,一个用于,另一个用于。 引用以下内容的javadoc : 默认情况下,每个对象只能同时打开一个对象。因此,如果一个对象的读取与另一对象的读取交错,则每个对象必须已由不同的对象

  • 问题内容: 我已经为此工作了将近一天半,但似乎无法解决此错误。我不知道为什么ResultSet被关闭。也许有些人可以帮助我。 MySQL数据库: MySQLHandler MySQL捐赠 异常发生在这里:在MySQLDonation的while循环中,实际的堆栈跟踪是这样的: 有了这些信息,我可以说这 确实 有效,我得到了我的信息,但不是游戏中的内容,而是重复出现的内容,就像用户从未从查询中删除一

  • 问题内容: 我正在尝试执行getPendingSalesOrderIDs()方法,该方法调用方法selectInAsending(…)。 但这显示了一个SQLException,它说java.sql.SQLException:在ResultSet关闭后不允许进行该操作 此处db.endSelect()将关闭所有连接。 我认为问题就在于此。 问题答案: 如果关闭ResultSet,为什么不删除它(在

  • 问题内容: 获取java.sql.SQLException:ResultSet关闭后不允许进行操作当我执行以下代码时,出现异常。我认为这是因为我正在与他相同的连接对象编写新语句。我应该如何重写它,以便可以创建准备好的语句并开始使用rs2?即使连接到相同的数据库,我也必须创建一个新的连接对象吗? 问题答案: 问题在于你在中获取数据的方式。每次访问你都会获得新鲜的食物,但你不会关闭它。 这违反了Sta

  • 我目前正在使用MySQL for DB connection开发一个Struts2 Web应用程序,并且在实际工作中遇到了代码部分的问题。恒定误差: 我目前拥有的RequestAction类基本上是我的一个工作项目的完整副本,但由于某些原因,我无法使其用于此应用程序。 请求操作。Java: 不知道为什么连接不工作,我试图乱搞,看看从我的其他项目,看看有什么差异,使连接和无法找到它,除非是给问题。

  • 我正在将MySQL与Java结合使用,试图制作shoppingcartDB,并试图删除从订购到现在已经过了30天的元组。 但是编译器说: 我如何解决这个问题? 代码: 抛出异常的代码行是: stmt。executeUpdate(“从篮子中删除,其中orderdate=““Odate”;”);