- PR -

java.sql.SQLException: クローズされた結果セットです。: nextというエラーどうやって解決すれば?

1
投稿者投稿内容
うさぎ鍋
会議室デビュー日: 2004/12/22
投稿数: 16
お住まい・勤務地: 静岡
投稿日時: 2005-01-05 21:06
デバッグの時にjava.sql.SQLException: クローズされた結果セットです。: next
というようなエラーが出ました。
java.sql.SQLException自体は、データベースアクセスエラーまたはその他のエラーに関する情報を提供する例外であるらしいと調べて見てわかりましたがどう解決していいのか解りません。
以上はこのエラーが起こった付近のプログラムです。
if(strShoriPara.equals("0")) { //新規記事入力の場合
out.println(" <td colspan=\"2\" align=\"center\" class=\"title\"><br>記事新規入力<br><br></td>");
} else {
out.println(" <td colspan=\"2\" align=\"center\" class=\"title\"><br>記事編集入力<br><br></td>");
}
out.println(" </tr>");

//権限フラグ取得tk_gyousya_check
sql = "";
sql = sql + "SELECT kengenflag";
sql = sql + " FROM TOKAI.TK_GYOUSYA";
sql = sql + " WHERE gyousyac = '" + strID + "'";

//ステートメント作成
st = cn.createStatement();
//SQL実行
rs = st.executeQuery(sql);
if(rs.next()) {
strKengenflag = rs.getString("kengenflag");
}
//レコードセットクローズ
rs.close();
//ステートメントクローズ
st.close();

//リリース番号最大値取得get_max_releaseno
sql = "";
sql = sql + "SELECT MAX(releaseno) releaseno";
sql = sql + " FROM TOKAI.TKN_RELEASE_HEAD";
sql = sql + " WHERE SUBSTR(releaseno, 1, 10) = '" + strReleaseyearPara + "' || TO_CHAR(TO_NUMBER(" + strReleasemonthPara + "), 'FM09') || TO_CHAR(TO_NUMBER(" + strReleasedayPara + "), 'FM09') || " + strKengenflag + "";

//ステートメント作成
st = cn.createStatement();
//SQL実行
rs = st.executeQuery(sql);
if(rs.next()) {
strReleaseno = rs.getString("releaseno");
}
//レコードセットクローズ
rs.close();
//ステートメントクローズ
st.close();

if(strShoriPara.equals("0") && strFlagPara.equals("0")) { //新規追加初回時
if(strReleaseno == null) {
strReleaseno = strReleaseyearPara + new DecimalFormat("00").format(Integer.parseInt(strReleasemonthPara)) + new DecimalFormat("00").format(Integer.parseInt(strReleasedayPara)) + strKengenflag + "01";
} else {
strReleaseno = strReleaseno + 1;
}
dateReleasedate = DateFormat.getInstance().parse(strReleaseyearPara + "/" + strReleasemonthPara + "/" + strReleaseday + " 00:00:00");
strTitle = null;
strSubtitle1 = null;
strSubtitle2 = null;
strSubtitle3 = null;
strPdf = null;
strNaiyou = null;
} else { //新規追加初回時以外
//記事HEADデータ取得
//SQL設定
sql = "";
sql = sql + "SELECT releaseno, releasedate, keisaidate1,to_Char(keisaidate1, 'HH24')keisaidate1_2, keisaidate2,to_Char(keisaidate2, 'HH24')keisaidate2_2, title, subtitle1, subtitle2, subtitle3, pdf";
sql = sql + " FROM TOKAI.TKN_TEMP_RELEASE_HEAD";
if(!(strFlagPara.equals("0"))) {
sql = sql + " WHERE releaseno = '" + strReleasenoPara + "'";
}
//ステートメント作成
st = cn.createStatement();
//SQL実行
rs = st.executeQuery(sql);
if(rs.next()) {
strReleaseno = rs.getString("releaseno");
dateReleasedate = rs.getDate("releasedate");
strKeisaidate1 = rs.getString("keisaidate1");
strKeisaidate1_2 = rs.getString("keisaidate1_2");
strKeisaidate2 = rs.getString("keisaidate2");
strKeisaidate2_2 = rs.getString("keisaidate2_2");
strTitle = rs.getString("title");
strSubtitle1 = rs.getString("subtitle1");
strSubtitle2 = rs.getString("subtitle2");
strSubtitle3 = rs.getString("subtitle3");
strPdf = rs.getString("pdf");
}
//レコードセットクローズ
rs.close();
//ステートメントクローズ
st.close();

//記事BODYデータ取得
//SQL設定
sql = "";
sql = sql + "SELECT releaseno, naiyou";
sql = sql + " FROM TOKAI.TKN_TEMP_RELEASE_BODY";
if(!(strFlagPara.equals("0"))) {
sql = sql + " WHERE releaseno = '" + strReleasenoPara + "'";
}
//ORDER BY設定・昇順並び替え
sql = sql + " ORDER BY renno ASC";

//ステートメント作成
st = cn.createStatement();
//SQL実行
strNaiyou2 = null;
while(rs.next()) {
//変数初期化
strReleaseno = null;
strNaiyou = null;
//変数取得
strReleaseno = rs.getString("releaseno");
strNaiyou = rs.getString("naiyou");
//内容データ結合(分割されたデータを一つにまとめる)
strNaiyou = strNaiyou + strNaiyou2;
}
//レコードセットクローズ
rs.close();
//ステートメントクローズ
st.close();
}
恐らくwhile(rs.next())より以前に同じSQLが閉じられているのだと推測したのですがどうも見当たりません・・・・・;;
Javaをはじめて日が浅く期限がギリギリなのでこういったところに頼るしか・・・・
どうかご教授して下さいますようよろしくお願いします。
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2005-01-05 22:04
コード:
//ステートメント作成 
st = cn.createStatement(); 
//SQL実行 
strNaiyou2 = null; 
while(rs.next()) {


ここで rs に新しいリザルトセットを代入していないからではないでしょうか?

SQLExceptionのスタックトレースに発生したソースコード上の行数が出ているはず
ですので、それを頼りにすれば特定できると思います。

あと、余談ですが、変数を使いまわすのは個人的にはあまりおすすめしません。
今回も変数rsを使いまわしていなければNullPointerExcepionなどの
実行時エラーとなり、少しは原因特定しやすかったと思いますよ。

1

スキルアップ/キャリアアップ(JOB@IT)