1. ホーム
  2. mysql

java.sql.SQLException: ResultSet が閉じた後の操作は許可されません。

2022-02-13 11:14:01
java.sql.SQLException: ResultSet が終了した後の操作は許可されません。
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:794)
at com.mysql.jdbc.ResultSetImpl.next(ResultSetImpl.java:7145)
at org.xxx.similarity.Similarity.createIndexTable(Similarity.java:26)

at org.xxx.similarity.similarity.main(similarity.java:56)


<スパン

<スパン <スパン

Baiduこの問題、与えられた解決策は、です。

<スパン <スパン <スパン 操作するstmtが複数のrsである。その場合、stmt の rs1 を直ちに操作してから、他の rs2 を操作しなければならない。

<スパン <スパン 使い分けではなく、rs is closed エラーが発生します。このエラーのコードは次のとおりです。

<スパン <スパン <スパン stmt=conn.createStatement()。 

<スパン <スパン rs=stmt.executeQuery("select *)  fromt1")となります。 

<スパン <スパン <スパン rst=stmt.executeQuery("セレクト *) をt2")から削除してください。

<スパン rs.last();// rst=stmt.executeQuery(sql_a); の実行で、rsはクローズアウトされます! ということで、ResultSetが閉じられたというメッセージを表示したまま、ここまで実行されます。

<スパン <スパン エラーメッセージは次のとおりです: java.sql.SQLException:Operation not allowed after ResultSet closed rst.last();

<スパン <スパン 正しいコードです。

<スパン <スパン <スパン stmt=conn.createStatement()。 

<スパン <スパン rs=stmt.executeQuery("select * fromt1") を実行します。 

<スパン <スパン rs.last();// rsに対する操作をすぐに行い、操作後にデータベースからrstを取得し、rstに対する操作を行う必要があります。

<スパン <スパン rst=stmt.executeQuery("select * from t2");

<スパン <スパン rst.last()。


<スパン

<スパン

<スパン <スパン このエラーの原因のひとつはもちろんこれですが、もうひとつ、次のコードをご覧ください。

<スパン <スパン Class.forName("com.mysql.jdbc.Driver")を使用します。
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/hellosql","root", "123") を実行しました。
stmt=conn.createStatement()。

<スパン <スパン sql= "SELECT LAST_INSERT_ID() from"+tableName;

<スパン <スパン rs =stmt.executeQuery(sql)。

<スパン <スパン while(rs.next()){。 <未定義

<スパン <スパン <スパン sql = "update "+tableName+" set notifyURL='"+URLUtil.getRequestServerContext(request) +"/NotifyAction?id=" +rs.getInt(1)+"' where id ="+rs.getInt(1)とします。
stmt.executeUpdate(sql)を実行します。

<スパン <スパン }
rs.close()を実行します。

<スパン <スパン rs =null。

<スパン <スパン stmt.close()を実行します。

<スパン <スパン stmt =null。

<スパン <スパン con.close()を実行します。

<スパン <スパン con =null。

<スパン <スパン <スパン

<スパン <スパン <スパン <スパン その理由は executeUpdate関数とexecute関数は、自動的にresultSetを返します!

boolean java.sql. ステートメント .execute() 文字列 sql) をスローします。 SQLException

<スパン <スパン <スパン

与えられたSQL文を実行し、複数の結果を返すことがあります。状況によっては(まれですが)、一つの SQL 文が複数の結果セットや更新回数を返すことがあります。(1) 複数の結果を返すことがわかっているストアドプロシージャを実行している場合、または (2) 未知の SQL 文字列を動的に実行している場合以外は、通常はこれを無視してもかまいません。

execute メソッドは SQL 文を実行し、最初の結果の形式を示します。 getResultSet または getUpdateCount で結果を取得し getMoreResults を押すと、その後に続く結果に移動します。