[解決済み] java.sql.SQLException を取得しました。ResultSet が終了した後の操作は許可されません。
質問
以下のコードを実行すると、例外が発生します。同じ接続オブジェクトで新しいステートメントを準備しているからだと思います。プリペアド・ステートメントを作成し、かつrs2を使用できるようにするには、どのように書き直せばよいのでしょうか?同じDBに接続する場合でも、新しい接続オブジェクトを作成しなければならないのでしょうか?
try
{
//Get some stuff
String name = "";
String sql = "SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;";
ResultSet rs = statement.executeQuery(sql);
if(rs.next())
{
name = rs.getString("name");
}
String sql2 = "SELECT `id` FROM `profiles` WHERE `id` =" + profId + ";";
ResultSet rs2 = statement.executeQuery(sql2);
String updateSql = "INSERT INTO `blah`............";
PreparedStatement pst = (PreparedStatement)connection.prepareStatement(updateSql);
while(rs2.next())
{
int id = rs2.getInt("id");
int stuff = getStuff(id);
pst.setInt(1, stuff);
pst.addBatch();
}
pst.executeBatch();
}
catch (Exception e)
{
e.printStackTrace();
}
private int getStuff(int id)
{
try
{
String sql = "SELECT ......;";
ResultSet rs = statement.executeQuery(sql);
if(rs.next())
{
return rs.getInt("something");
}
return -1;
}//code continues
解決方法は?
でのデータ取得方法に問題があります。
getStuff()
. にアクセスするたびに
getStuff()
を取得し、新しい
ResultSet
が、閉じない。
の期待に反しています。
Statement
クラス(こちら -
http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html
):
デフォルトでは、1つのStatementオブジェクトに対して、1つのResultSetオブジェクトしか同時に開くことができません。したがって、ある ResultSet オブジェクトの読み取りと別の ResultSet オブジェクトの読み取りが混在する場合、それぞれは異なる Statement オブジェクトによって生成されたものである必要があります。Statementインターフェイスのすべての実行メソッドは、開いているResultSetオブジェクトが存在する場合、暗黙のうちにStatementの現在のResultSetオブジェクトを閉じます。
さらに事態を悪化させるのは
rs
を呼び出しコードから削除します。これはまた
statement
フィールドがありますが、閉じられてはいません。
結論:複数の
ResultSet
同じ
Statement
オブジェクトが同時に開かれる。
関連
-
[解決済み] java.sql.SQLException: ユーザー 'root'@'localhost' (using password: YES) のためのアクセスが拒否されました。
-
[解決済み】エラー:配列または java.lang.Iterable のインスタンスに対してのみ反復処理を行うことができます。
-
[解決済み】このコンパイルユニットは名前付きモジュールに関連しているため、名前付きパッケージeclipseを宣言する必要があります。
-
[解決済み】"|="の意味は何ですか?(パイプ等号演算子)
-
[解決済み] メソッドがスーパータイプのメソッドをオーバーライドまたは実装していない - Overrideの場合
-
[解決済み】非閉鎖文字リテラルエラー
-
[解決済み] メソッドがそのスーパークラスのメソッドをオーバーライドしない
-
[解決済み】文字列中の � を置換する方法
-
[解決済み】Eclipseで「JUnitテストが見つかりませんでした。
-
[解決済み】ホスト 'xxx.xx.xxx.xxx' がこのMySQLサーバーへの接続を許可されていない。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】HTTPステータス 405 - リクエストメソッド「POST」はサポートされていません (Spring MVC)
-
[解決済み】エラー:配列または java.lang.Iterable のインスタンスに対してのみ反復処理を行うことができます。
-
[解決済み】このコンパイルユニットは名前付きモジュールに関連しているため、名前付きパッケージeclipseを宣言する必要があります。
-
[解決済み] hibernateでResultSetを抽出できない。
-
[解決済み】不正なエスケープ文字"㊧"について
-
[解決済み] メソッドがスーパータイプのメソッドをオーバーライドまたは実装していない - Overrideの場合
-
[解決済み】「error: '.class' expected」の意味と修正方法について
-
[解決済み】Javaメソッドスタブ
-
[解決済み】Javaのswitch文。定数式が必要だが、定数である
-
[解決済み] StringBuilderをクリアまたは空にするにはどうすればよいですか?重複] [重複] [重複] [重複] [重複] [重複