1. ホーム
  2. Java

結果セットクローズエラー解決後の操作不可

2022-02-22 14:28:44

これまで遭遇した限りでは、この問題が発生するケースは主に2つあり、1つは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です。



ResultSetが閉じたrst.last()の後では、許可されません。

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

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

<スパン <スパン rs=stmt.executeQuery("select)



* fromt1"); 

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

<スパン <スパン rst=stmt.executeQuery("セレクト



* from t2");

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

<スパン <スパン この意味はおそらく、同じ瞬間に各Statementオブジェクトは1つのResultSetオブジェクトしか開くことができず、プログラム実行時にrst=stmt.executeQuery(sql_a);rsはクローズアウトされる!ということでしょう。

<スパン <スパン 消しても操作すると、間違いなくエラーになります。解決策は、複数のResultSetオブジェクトを同時に開くのではなく、操作ごとに1つずつ開くことです。

<スパン <スパン というような問題もあります。

<スパン <スパン <スパン 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).id='quot'とします。







stmt.executeUpdate(sql)を実行します。

<スパン <スパン }

<スパン <スパン 現在インターネット上では、whileループの外でrsを閉じるなど、喝采を浴びる方法がたくさんありますが、これでは問題が解決しません。問題はrsを閉じるタイミングがおかしいのではなく

<スパン <スパン execute操作を実行するたびに、rsは自動的にクローズされます。すでに閉じた rs に対して next を実行するのは明らかに間違っています。解決策は、whileループに次の文を追加することです。

<スパン <スパン <スパン コード

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

<スパン <スパン stmtが使用されるたびに、新しいStatementオブジェクトを作成します。こうすることで、rsを何度も使用することがなくなります。



<スパン <スパン