1. ホーム
  2. Java

エラー:ResultSetが閉じた後の操作は許可されません。

2022-02-22 10:02:20

     今日、学校のWebサイトに問題が発生し、エラーメッセージが表示されました。 ResultSet を閉じた後の操作は許可されていません。 ウェブで検索した結果、以下のように問題を解決する記事を見つけました。

複数の rs 操作を含む stmt は、以下の問題を引き起こします。 結果セットが閉じている エラー

1つのstmtで複数のrsを操作する。



そして、その stmt の rs1 を直ちに操作してから、他の rs2 を操作する必要があります。



これらを入れ替えて使用すると、rsがクローズされることになります エラー .



エラー のコードは :



 stmt=conn.createStatement()。



 rs=stmt.executeQuery("select * from t1")を実行します。



 rst=stmt.executeQuery("select * from t2")を実行します。



 rs.last();// rst=stmt.executeQuery(sql_a); の実行により、rsはクローズアウトされます!rs.last();の実行により、rstはクローズアウトされます。そのため、プログラムの実行は、この時点でプロンプトが表示されます。 結果セット が閉じられました。 エラー メッセージは : java.sql.SQLException : 操作方法 ではなく 結果セット 閉鎖



 rst.last()。







正しいコード :







 stmt=conn.createStatement()。



 rs=stmt.executeQuery("select * from t1")を実行します。



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



 rst=stmt.executeQuery("select * from t2")とします。



 rst.last()。







その理由は :



 静的SQL文を実行し、その結果を返すために使用されるオブジェクトです。    



 デフォルトでは、1つの  結果セット   オブジェクトを同時に開くことができます。したがって、もし1つの  結果セット   オブジェクトの読み込みと別のオブジェクトの読み込みが混在している場合、それぞれ別の Statement オブジェクトによって生成されている必要があります。 インターフェイスは、Statement の現在の  結果セット   オブジェクトが存在する場合、そのオブジェクトを開くことができます。    







1つのstmtは1つのrsに対応するのが理想的ですが、1つのstmtで2つのrsを同時に開くと、このようなことが起こり得ます。



そこで、このような問題を解決するために : 1. 1つのrsに対して1つのstmtを作成すればよい。2. 複数のrsに対して1つのstmtを使用する場合、1つのrsだけを取得して操作し、他の処理は上記の"正しいコード"のように最初のrsの後に行うことができます。







複数のstmtをそれぞれのrsのために使用する。



stmt=conn.createStatement()です。



stmt2=conn.createStatement()を使用します。



rs=stmt.executeQuery("select * from t1")を実行します。



rst=stmt2.executeQuery("select * from t2")を実行します。



rs.last()。



rst.last()。