• ベストアンサー

SQLException

こんにちわ。 Javaのプログラム上で、Select分を発行して、その結果をBeanに格納する処理で、resultset.next()を行うとそこで com.ibm.db2.jcc.b.SQLException: Invalid operation: result set closed となり、エラーになります。 原因がわからないのですが、うまくコネクトできていないのでしょうか? よろしくお願いします。

  • Java
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

result set closedはjava.sql.Resultsetのオブジェクトが何処かでclose()されてしまっている可能性があります。 ResultSet rs = stmt.executeQuery("SELECT...");から resultset.next();までの間で、何処かclose()処理をしてしまっている場所を探してみて下さい。 ちなみに、ResultSet オブジェクトは、このオブジェクトを生成した Statement オブジェクトが閉じられるとき、再実行されるとき、あるいは一連の複数の結果から次の結果を取り出すために使われるときに、自動的に閉じられます。 DB2をお使いのようなので、URLにDB2のメッセージ解説書のリンクを添付しておきます。エラーコードで検索すると更にわかると思います。

参考URL:
http://www.db2.jp/siryo/db2online/db2m0/frame3.htm#

その他の回答 (1)

  • covachan
  • ベストアンサー率38% (46/120)
回答No.1

エラーに書かれている通りです。 >result set closed つまり、コネクションがクローズされているということです。 コネクションがクローズされている状態では、ResultSetからの読み込みは出来ません。 その為にBeanに格納するというのが理由の一つだと思うのですが(^^;

関連するQ&A

  • メモリリーク(?)時にSQLException

    メモリリーク(?)時にSQLException 初めて質問させていただきます。 java+mysqlでWebアプリを作成しているのですが、DBからデータ取得後、取得結果をStringに格納するところで2回に1回だけエラーとなってしまいます。 具体的には下記のようなプログラム実行時にSQLExceptionが出てしまいます。 // ---- プログラム // ・・・(略)・・・ String str = ""; rs = pst.executeQuery(); while (rs.next())} str = str + rs.getString("name"); } // ---- 出力されるエラー(途中まで) java.sql.SQLException: Operation not allowed after ResultSet closed at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910) at com.mysql.jdbc.ResultSet.checkClosed(ResultSet.java:644) at com.mysql.jdbc.ResultSet.next(ResultSet.java:6663) ResultSetがクローズされてるよというエラーだと思うのですが、 str = str + rs.getString("name"); のところを str = rs.getString("name"); に書き換えた場合と、String型ではなくStringBufferでappendを使って文字列連結させていった場合はエラーになりません。 また、ログを入れて動作状況を確認してみたところwhile文は何回かは動いているようです。 ※while文は5000回以上ループし、strは最終的にかなり大きいサイズになります。 このような状況を考えると、メモリリークが発生して落ちているのかと思うのですが、発生しているエラー内容は上記の通りSQLExceptionです。 また、一番腑に落ちないのはこのエラーが2回に1回だけ出る、ということです。 同じような現象をご存知の方がいらっしゃいましたら、何が起こっているのか教えていただけないでしょうか? 未熟ながら私の予想ですと、メモリリークが発生する前にjavaがGCでメモリクリアしようとしているんだけど、そのときにResultSetも一緒に消しちゃってる・・・? javaやjdbcのバグ???とも考えているのですが、どうやって確認したらいいのかわからず困っています。

    • ベストアンサー
    • Java
  • ResultSetの内部構造(Java)

    JavaでDBから値を抽出してくるプログラムを作っています。 SQLの結果をResultSetのオブジェクト(参照変数名を「results」とする)に格納しているのですが、 Eclipseのデバッグ機能実行中に、resultsに格納されたDBからの値を書き換えてテストしたいです。 が、 resultsの中には非常に多くの情報が格納されているため、 どこに値が格納されているのか見つけ出す事が出来ませんでした。 DBから取得した値は、ResultSetの中のどこに格納されているのでしょうか? 「"results>xxxxx>xxxxxx>xxxxxx"に格納されている」というような形でご教示頂けると嬉しいです! よろしくお願いします。

    • ベストアンサー
    • Java
  • type 4 jdbc経由のDB2へのアクセスでNo suitable driverエラー

    type 2 jdbcドライバを使ったDB2へアクセス失敗して困っております。 -db2jcc.jar db2jcc_licence_cu.jar db2jcc_licence_cisuz.jar をクラスパスに指定。 public class sampleAction extends Action { public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { ServletContext context = getServlet().getServletContext(); sampleForm sap = new sampleForm(); String ID = sap.getId(); String PW = sap.getPw(); try { Class.forName("com.ibm.db2.jcc.DB2Driver ").newInstance(); Connection dbConn = DriverManager.getConnection("jdbc:db2:MYMALL", "db2admin", "db2admin"); Statement stmt = dbConn.createStatement(); ResultSet rs =stmt.executeQuery("select * from DB2ADMIN.PASSWORD where ID = '" + ID + "'"); String pwstr = rs.getString("PW"); if (PW.equals(pwstr)) { String namestr = rs.getString("NAME"); sap.setNameresult(namestr); String name1 = sap.getNameresult(); context.setAttribute("NAME1", name1); } stmt.close(); dbConn.close(); } catch (Exception e) { e.printStackTrace(); } return (mapping.findForward("success")); } } 上記のコードを実行すると java.lang.ClassNotFoundException: com/ibm/db2/jcc/DB2Driver となります。 チェックするべき点や 解決策についてご存知の方がいらっしゃいましたら どうか宜しくお願いします。

    • ベストアンサー
    • Java
  • DBのコネクションのclose処理で例外が発生した場合

    DBのコネクションのclose処理で例外が発生した場合 DBアクセスが終わった後、finallyでResultSetやConnection、PreparedStatementのclose処理を行うと思います。 } finally { if (result != null) { try { result.close(); } catch (SQLException e) { } } if (ps != null) { try { ps.close(); } catch (SQLException e) { } } if (conn != null) { try { conn.close(); } catch (SQLException e) { } } } 上記では各close処理で例外が発生した場合、何もしていませんがこのあたりの処理は何を行うべきなのでしょうか。 例えばログ出力をして例外をそのまま上位にスローするなどでしょうか。 close処理で例外が発生するのは余程のことだと思うのですが、ログ出力以外で何かやるべき処理はありますでしょうか。

    • ベストアンサー
    • Java
  • JavaからMDB接続について

    下記PGについて ------------------------------------ import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class ClassDatabase { public static Connection connection; public static Statement statement; public static ResultSet resultSet; public void main(String DBNM) { try { // Load the UCanAccess JDBC driver Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); // Define the database URL String url = "jdbc:ucanaccess://" + DBNM + ";"; // Establish the connection DB_CONNECT(url); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static void DB_CONNECT(String url) { try { connection = DriverManager.getConnection(url); } catch (SQLException e) { e.printStackTrace(); } finally { // Close the connection when you're done if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } ------------------------------------ connection = DriverManager.getConnection(url);の所ですが応答が帰って来ないほど遅いのですがどうにかなりますでしょうか? MDBと接続はできています。(整合性チェック等を行っているようです、させない方法等ありますでしょうか?)

    • ベストアンサー
    • Java
  • MySQLを利用したサーブレットの実行時のエラーについて。

    ローカルマシンにMySQLをインストールし、サーブレットでアクセスするプログラムを作っています。MySQLの動作は確認済みです。 MySQLのPATHとJDBCドライバのCLATHPASSの設定もしました。サーブレットのソースはWEB上のサンプルをそのまま利用しています。 DBの設定部分のソース↓ Class.forName("org.gjt.mm.mysql.Driver"); Connection con = DriverManager.getConnection"jdbc:mysql:///hellodb"); PATH↓ C:\Program Files\mysql\bin CLATHPASS↓ C:\j2sdk1.4.0\jre\lib\ext\mysql-connector-java-3.0.2-beta-bin.jar エラー内容は以下の通りです。 --------------------------------------------------------------------- java.sql.SQLException: Column 'NO' not found. at com.mysql.jdbc.ResultSet.findColumn(ResultSet.java:2862) at com.mysql.jdbc.ResultSet.getInt(ResultSet.java:1338) at HelloWorldJDBCMySQL.main(HelloWorldJDBCMySQL.java:24) --------------------------------------------------------------------- DBへアクセスできていないと思うのですが、自分で調べた限りでは前述の設定以外の方法が調べきれませんでした。 お力添えお願いいたします。

  • postgresql接続時

    お世話になっています。 現在、postgresqlに接続し、指定のデータがなければ、dbを切断し、 切断中に、dbに接続されたら、エラーを発生させるようなプログラムを作成しています。 その際、org.postgresql.util.PSQLException: This ResultSet is closed.のようなエラーが発生します。 原因として、ResultSetにあるというのはわかるのですが、 ソースは、以下のように組んでいます。 static Connection con = null; static Statement stmt = null; static ResultSet rs ;; try { Class.forName("org.postgresql.Driver"); // PostgreSQLの場合 con = DriverManager.getConnection ("jdbc:postgresql:sample","moon","post"); // ステートメントオブジェクトを生成 stmt = con.createStatement(); String sql = " select id,pw from login where id='test' and pw='a'"; System.out.println(sql); // クエリーを実行して結果セットを取得 rs = stmt.executeQuery(sql); boolean ba = rs.next(); //もし、idがなければ、dbを閉じる if(ba == false) { System.out.println("rs:"+rs.next()); stmt.close(); con.close(); rs.close(); } catch (SQLException e) { } catch (ClassNotFoundException c) { } catch(Exception es) { } finally { } //この時点で、指定のid,pwが存在していないので、dbは切断中 //この状態でdbにアクセスする String sql = " select * from login"; // クエリーを実行して結果セットを取得 try { // ここから if(con !=null && stmt != null && rs !=null) { while(rs.next()) { System.out.println(rs.getString("id")); } }//ここまでが、何かがおかしい else {} } catch (SQLException e) {} この場合、どこが間違っているのでしょうか? 宜しくお願いします。

  • getStringの値がNULLの時の処理

    DB:SQL Server 2005 JDBCを使ってデータベースへアクセスし、SQL発行して結果をResultsetに格納、getStringで各項目の値を取得するところまでは確認できています。 外部結合したテーブルを参照していおり、getString()でnullを取得した場合にjava.lang.NullPointerExceptionが返ってエラーとなってしまいます。 回避策はあるのでしょうか? 抜粋したソースを下記に記します。 -- test.jsp -- <% ResultSet rs = db.executeQuery(sql); while(rs.next()){ String disp_object = rs.getString("object"); if(disp_object == null) disp_object="---"; } %> <tr>Object</tr> <tr><%=disp_object%></tr>

    • ベストアンサー
    • Java
  • JDBCのDB検索

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.mysql.jdbc.PreparedStatement; import com.mysql.jdbc.Statement; public class AddressDB { private static enum Procnumlist { NAME("名前"), FNAME("フルネーム"), END("終了"); private String name; private Procnumlist(String name) { } } //上の列挙型を基にした処理判定用マップを作成 private static final Map<Integer, Procnumlist> procmap; static { procmap = new HashMap<Integer, Procnumlist>(); procmap.put(1,Procnumlist.NAME); procmap.put(2,Procnumlist.FNAME); procmap.put(6,Procnumlist.END); } //結果 //ResultSetは受け取らない private static void ans(List<Addr> ans) { try { System.out.println("検索結果"); for (int i = 0; i < ans.size(); i++) { Addr addr = ans.get(i); System.out.println(addr.getName() + ":" ); } } catch (SQLException e) { e.printStackTrace(); } finally { //閉じる。 close(); } } //名前検索(フルネーム) private static List<Addr> srchFName(String keyword,Connection con) throws IOException { String sql = "SELECT * FROM data2 where name=?"; PreparedStatement ps = null; try{ ps = (PreparedStatement) con.prepareStatement(sql); ps.setString(1,keyword); ResultSet rs = ps.executeQuery(); //List<Addr> result = new ArrayList(Addr); while(rs.next()){ rs.getString("name"); } }catch (SQLException ex) { } return null; } //名前検索 private static List<Addr> srchName(String keyword,Connection con) throws IOException { String sql = "SELECT * FROM data2 where name like ?"; PreparedStatement ps = null; try{ ps = (PreparedStatement) con.prepareStatement(sql); ps.setString(1,"%"+keyword+"%"); ResultSet rs = ps.executeQuery(); while(rs.next()){ Addr addr = rs.getString("name"); } }catch (SQLException ex) { } return result; } private static boolean checkProcNum(int value) { return procmap.get(value) != null; } public static void main(String[] args)throws IOException{ while(true) { createConeection(); //処理条件入力 System.out.println("検索\n1.名前(ファーストネーム)で検索\n2.フルネームで検索\n6.終了"); //検索値入力 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int procnum = Integer.valueOf(br.readLine()); //入力チェック if (!checkProcNum(procnum)) { System.out.println("正しい値を入れてください。"); continue; } Procnumlist proc = procmap.get(procnum); if (proc == Procnumlist.END) { break; } if(proc == Procnumlist.NAME){ System.out.println("名前を入力してください。"); BufferedReader name = new BufferedReader(new InputStreamReader(System.in)); String keyword = name.readLine(); List<Addr> result = srchName(keyword,null); ans(result); } if(proc == Procnumlist.FNAME){ System.out.println("フルネームを入力してください。"); BufferedReader name = new BufferedReader(new InputStreamReader(System.in)); String keyword = name.readLine(); List<Addr> result = srchFName(keyword,null); ans(result); } } } //コネクション private static Connection createConeection() { String url = "jdbc:mysql://localhost/address"; String user = "test"; String password = "pass"; try { return DriverManager.getConnection(url, user, password); } catch (SQLException e) { e.printStackTrace(); return null; } } } 現在JDBCでDB接続し入力された値をDBから検索し出力するものを作成しておりますが詰んでしまいました。 入力した値をsrchで検索し結果をansで出力しようとしています。どのようにしたらよいのでしょうか

  • JDBCについて

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import com.mysql.jdbc.PreparedStatement; import com.mysql.jdbc.Statement; public class DBtest { public static void main(String[] args){ try { Connection con = null; PreparedStatement ps = null; String url = "jdbc:mysql://localhost/address"; String user = "test"; String password = "pass"; con = DriverManager.getConnection(url, user, password); Statement st = (Statement) con.createStatement(); Statement st2 = (Statement) con.createStatement(); String sql = "SELECT * FROM data2"; ResultSet rs = st2.executeQuery(sql); try { System.out.println("ok"); // ここでクエリを実行 while(rs.next()){ System.out.println(rs.getString("name")+rs.getString("age")); } //氏名入力 System.out.println("氏名を入力してください。"); BufferedReader na = new BufferedReader(new InputStreamReader(System.in)); String Na = na.readLine(); String ins = "INSERT INTO data2(name,age)VALUES('?',20)"; ps = (PreparedStatement) con.prepareStatement(ins); ps.setString(1,Na); ps.executeUpdate(); //INSERT実行 int rs2 = st2.executeUpdate(ins); System.out.println(rs2); } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } finally { // 直前の try ブロックに入ったら、ここは必ず実行される con.close(); } } catch (SQLException ex) { System.out.println("SQLException: " + ex.getMessage()); System.out.println("SQLState: " + ex.getSQLState()); System.out.println("VendorError: " + ex.getErrorCode()); // 接続できない時 } } } 現在javaでmysqlに接続してDB内の検索や追加等を行うものを作成しています。 現状は入力されたものをDBに追加することまでできましたが 検索で 入力された値がDBの中に一致する、または部分一致したものを表示させるやり方がわかりません

    • ベストアンサー
    • Java

専門家に質問してみよう