在“结果集关闭后不允许操作”中出现错误

问题描述 投票:0回答:1

我得到例外:

ResultSet关闭后不允许操作

它说问题出在方法“teamNumberGet = rs.getInt("something");"

我哪里错了?

代码:

try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection conn = DriverManager.getConnection(url, username, password);
            Statement stmt = conn.createStatement();

            String sql = "SELECT * FROM MatchScouting";
            ResultSet rs = stmt.executeQuery(sql);


            for (int ayooo = 1; ayooo < indexReadFromDatabase; ayooo++) {
                     rs.next();
            }
                ayo(rs, conn);
}
 catch (SQLException e) {
            throw new RuntimeException(e);
}

 public static void ayo(ResultSet rs, Connection conn) throws SQLException {
        int i = 0;
        while (rs.next()) {
            i++;
            System.out.println("team---------------------------------" + i);

            teamNumberGet = rs.getInt("something");
        }
           
} 

我试图找出是否有任何地方可以使结果集“rs”关闭,但它从来没有

java mysql jdbc
1个回答
0
投票

只循环一次结果集

您通过在同一结果集上循环两次,超过了

ResulSet
的最后一行。

首先你运行你的

for
循环(你忽略了向我们解释):

        for (int ayooo = 1; ayooo < indexReadFromDatabase; ayooo++) {
                 rs.next();
        }

然后将 ResultSet 传递给

mayo
方法,在该方法中继续调用
ResultSet#next
。我们不知道
indexReadFromDatabase
的值,但在某些时候您对
next
的连续调用会将光标移到结果集的末尾。

解决方案:只循环一次结果集.

其他问题:

  • 在现代Java中,我们不需要调用
    Class.forName
    。许多年前,JDBC 被更改为通过 Service Provider Interface (SPI) facility 自动加载驱动程序。
  • 您应该在完成后关闭 JDBC 资源。 Java 7+ 的try-with-resources语法使这变得简单。
try (
    Connection  conn = myDataSource.getConnection( myUrl , "" , "" ) ;
    Statement stmt = conn.createStatement() ; 
    ResultSet  rs = stmt.executeQuery(myQuery) ; 
)   
{
    while ( rs.next() ) { 
        … process results
    } 
} catch ( SqlException e ) {
    … handle exception
}
© www.soinside.com 2019 - 2024. All rights reserved.