• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ResultSetオブジェクトのメソッドについて)

ResultSetオブジェクトのメソッドでエラーが発生する問題について

このQ&Aのポイント
  • JDBCを使用してAccessのRDBに接続し、ResultSetオブジェクトのprevious()メソッドやfirst()メソッドを使用するとエラーが発生します。
  • next()メソッドを使用した後に、データの処理についてわからない点があります。
  • カーソルのバックはできないというエラーが表示されます。

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

  • ベストアンサー
noname#16216
noname#16216
回答No.1

エラーメッセージに出力されている通り、例えば Statement st = connection.createStatement(); ResultSet resultset = st.executeQuery(SQL文); という風にResultSet オブジェクトを取得した場合、ResultSet のオブジェクトは 順方向(TYPE_FORWARD_ONLY)で取得されます。 このためカーソルを戻そうとする(previos()やfirst()を使う)とSQLExceptionが発生します。 これを回避するためには、 Statement st = connection.createStatement (   ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet resultset = st.executeQuery(SQL文); のように設定します。 これだと、エラーを発生させずに、previos()やfirst()を使用することができます。 なお、上記の例だと、 int r = 0; while(resultset.next()) {  r++;  String 変数名 = resultset.getString("フィールド名"); } としてやれば、わざわざprevios()メソッドを使う必要がないように思いますが。。。

bushikun
質問者

お礼

spoonyさん、ご回答ありがとうございました。 無事に、データ表示することができました。 大変、助かりまた勉強になりました。 >nt r = 0; >while(resultset.next()) { > r++; > String 変数名 = resultset.getString("フィールド>名"); >} > >としてやれば、わざわざprevios()メソッドを使う必要がないように思いますが。。。 取得したデータの処理をする前に、データ数を数えたかったのであの様なプログラム順序にしました。他にもっといい方法があると思うのですが。。。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • javaのResultSetについて

    javaのResultSetについてですが、getStringでSQL名を選択して取得するのですが、変数で指定した場合は、文字列と判断され取得できないのでしょうか? 例えばSQLの列名の「test」を取得したい場合は、「rs.getString(test)」と記述しますが、 以下のように変数に置き換えて、取得しようすると、 String test2 = "test"; rs.getString(test2)というようにすると、カラムがありませんとエラーが返ってきます。 変数に置き換えて実行したいのですが、何か良い方法がないかご教授いただけますでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • WebSphere/DB2/ResultSet close/Exception

    WebSphereを使って、Listenerで取得したデータソースを利用していますが、 String sql1 = "SELECT A1 FROM TEST1"; String sql2 = "SELECT B2 FROM TEST2 WHERE B1 = ?"; Connection conn = datasource.getConnection(); PreparedStatement ps1 = conn.preparedStatement(sql1); ResultSet rs1 = ps1.executeQuery(); while(rs1.next()){ PreparedStatement ps2 = conn.preparedStatement(sql2); ps2.setString(1,rs1.getString("A1")); ResultSet rs2 = ps2.executeQuery(); ps2.close(); } このロジックで、ps2をクローズすると、ps1で取得したResultSet rs1がクローズされるというExceptionが発生してしまいます。 (ループして戻ったときにrs1.next()でexceptionが起こる) なにか対処方法があるかご存知の方いらっしゃいましたら、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • メソッド オーバーロード ete

    こんにちは 今オーバーロードやメソッドについて学習中です 今回作成したのはDB接続の 処理をするほうのクラスなのですが 同じソースはひとつにまとめろといわれました 自分なりに メソッドを作ってまとめてみたのですが まだだめなようです あとどのようにまとめれば 良いとおもいますか? 例文なども出していただけると助かります 一部ソースのせます public String[][] selectExec(String sql, int fromIdx) throws SQLException{ Statement smt = con.createStatement(); //ステートメントオブジェクト作成 SQL文を送るために作成 ResultSet aa=smt.executeQuery(sql); //SQLから要素取得 ArrayList<String> TESTNO = new ArrayList<String>(); //TESTNO用のArrayList作成 ArrayList<String> NAME = new ArrayList<String>(); //NAME用 ArrayList<String> KANA = new ArrayList<String>(); //KANA用 aa.relative(fromIdx-1); //カーソルの位置を移動 while(aa.next()){ TESTNO.add(aa.getString("TESTNO")); NAME.add(aa.getString("NAME")); KANA.add(aa.getString("KANA")); } aa.close(); //使い終わったリザルトクローズ smt.close(); //ステートメントクローズ      //オブジェクトの解放 hairetu(TESTNO,NAME,KANA); //配列に収納するメソッド呼び出し return hairetu(TESTNO,NAME,KANA); } /* * すべての行を取得 */ public String[][] selectExec(String sql) throws SQLException{ Statement smt = con.createStatement(); //ステートメントオブジェクト作成 SQL文を送るために作成 ResultSet aa=smt.executeQuery(sql); //SQLから要素取得 ArrayList<String> TESTNO = new ArrayList<String>(); //TESTNO用ののArrayList作成 ArrayList<String> NAME = new ArrayList<String>(); //KAME用 ArrayList<String> KANA = new ArrayList<String>(); //KANA用 while(aa.next()){ //Resultsetが最終行になるまで実行 TESTNO.add(aa.getString("TESTNO")); NAME.add(aa.getString("NAME")); KANA.add(aa.getString("KANA")); } aa.close(); //使い終わったリザルトクローズ smt.close(); //ステートメントクローズ      //オブジェクトの解放 return hairetu(TESTNO,NAME,KANA); } /* * 指定された行から行を取得 */ public String[][] selectExec(String sql, int fromIdx,int toIdx) throws SQLException{ Statement smt = con.createStatement(); //ステートメントオブジェクト作成 SQL文を送るために作成 ResultSet aa=smt.executeQuery(sql); //SQLから要素取得 ArrayList<String> TESTNO = new ArrayList<String>(); //TESTNO用ののArrayList作成 ArrayList<String> NAME = new ArrayList<String>(); //NAME用 ArrayList<String> KANA = new ArrayList<String>(); //KANA用 aa.relative(fromIdx); while(fromIdx<=toIdx){ TESTNO.add(aa.getString("TESTNO")); NAME.add(aa.getString("NAME")); KANA.add(aa.getString("KANA")); aa.next(); fromIdx++; } aa.close(); //使い終わったリザルトクローズ smt.close(); //ステートメントクローズ      //オブジェクトの解放 return hairetu(TESTNO,NAME,KANA); } public String[][] hairetu(ArrayList T,ArrayList N ,ArrayList K){ String[][]all=new String[3][T.size()]; all[0] = (String[])T.toArray(new String[0]);//配列TSETNOに収納 all[1] = (String[])N.toArray(new String[0]);//配列NAMEに収納 all[2] = (String[])K.toArray(new String[0]);//配列KANAに収納 return all; }/* リストから配列に収納するメソッド。 配列でリターンします */ 下のhairetuメソッドはあとから作成しました。 もうひとつ作ったのですが TEST(TESTNO,aa,"TESTNO"); TEST(NAME,aa,"NAME"); TEST(KANA,aa,"KANA"); 呼び出し↑ メソッド public ArrayList TEST(ArrayList T,ResultSet a ,String s) throws SQLException{ T.add(a.getString(s)); // リストにSQL文を収納 return T; } これは却下されました 見づらいとは思いますが いろいろアドバイスください

    • ベストアンサー
    • Java
  • intra-martの自動生成DAO

    intra-martを勉強中です。 eBuilder7.2を使用してDAOを自動性すると下記の問題が発生します。 回避方法をご存知でしたらご教示ください。 1)取得レコードが1件のSELECTメソッドを作成した場合  生成ソースのresultSet取得部分が数字の指定になる。  これをカラム名指定にしたい。  result.setEmpCd(resultSet.getString(1));  ->  result.setEmpCd(resultSet.getString("EMP_ID")); 2)取得レコードが複数件(配列)のSELECTメソッドを作成した場合  生成ソースのresultSet取得部分が  ダブルクォーテーション囲みの数字の指定になる。  当然"1"というカラムはないためException発生。  これをカラム名指定にしたい。  result.setEmpCd(resultSet.getString("1"));  ->  result.setEmpCd(resultSet.getString("EMP_ID"));

    • ベストアンサー
    • Java
  • ResultSetインターフェイスでの next() の使い方

    データベースからSQLをつかって受注件数を取得したい時に、なぜ、下記のように next() をしなければいけないのかが分かりません。 初心者なので、出来ましたら詳しく教えてください。 お願いします。 int count = 0 ; Statement stmt = con.createStatement() ; String sql = "select count(*) from 受注" ; ResultSet res = stmt.executeQuery(sql) ; if (res.next()) { count = res.getInt(1) ; }

    • ベストアンサー
    • Java
  • Resultsetについて困っています。

    Struts DBからデータを取得し、名称をコンボボックスに設定しようとしています。具体的には、一つの商品に登録してあるサイズと色をコンボボックスで表示しようとしています。 取得した値をbeanにセットしようとしているのですが、取得する値が複数ある項目が、複数ある場合について質問させて頂いております。 下記のように”SELECTDETAIL”でDBから1行 の項目の値を取得しています。列項目は"ID"と"NAME"です。 この先、"SIZE"と"color"の値をbeanにセットしようとしているます。"SELECTDETAIL"で取得するのは1行で、サイズと色は複数行なのでこの二つは"public List<Product>・・・"でbeanにセットしようと思っています。しかし、サイズと色の取得する行数は異なるので、それぞれ"public List<Product>・・・"を作った方がいいのでしょうか?お願い致します。 ---ProductはActionFormです--- private static final String SELECTDETAIL = "select * from goods_info where ID=?"; public Product getProduct(int ID) throws Exception{ Connection con = source.getConnection(); PreparedStatement pStmt = null; ResultSet rs = null; try{ pStmt = con.prepareStatement(SELECTDETAIL); pStmt.setInt(1,ID); rs = pStmt.executeQuery(); if(rs.next()){ return getProduct(rs); } }catch(SQLException ex){ throw ex; }finally{ if(rs != null){ rs.close(); } pStmt.close(); con.close(); } return null; } ---ActionFormにセット--- private Product getProduct(ResultSet rs) throws SQLException { Product pro = new Product(); pro.setGoods_info_id(rs.getInt("ID")); pro.setGoods_name(rs.getString("NAME")); return pro; }

  • do - while文

    こんにちは、tomokooです。 下記の様にソースを書きました。 rsはResultSetです。 ---------------------------- while(条件A){   処理; rs.next(); } while(rs.next()){   処理; } ---------------------------- うまくプログラムは動いたのですが 結果を見て1行飛ばされることに気づきました。 だから ---------------------------- while(条件A){   処理; rs.next(); } do{   処理; }while(rs.next()}; ---------------------------- としたところ、処理の中の rs.getString(i); //iは初期化済み で落ちてしまいます。 whileでよくてdo-whileでだめなことってあるんですか? 結構困ってます。 ご存知の方はよろしくお願いします。

  • メソッドの分割(リファクタリング?)

    指導教官からプログラム自体には問題はないが長すぎるのでメソッドを分割したほうがよいといわれました。以下に書きます(一部改変) try{ System.out.println("1. 2. どちらかを選択してください"); InputStreamReader reader = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(reader); String str = br.readLine(); int res = Integer.parseInt(str); if(!str.matches("[1-2]+")){ System.out.println("1、2から選択してください。"); continue;} if(res == 1){ System.out.println("キーワードを入力"); reader = new InputStreamReader(System.in); br = new BufferedReader(reader); str = br.readLine(); String sql = "SQL文"; ResultSet result = stmt.executeQuery(sql); //vectorにデータを格納 Vector vector1 = new Vector(); String[] array1 = new String[2]; while(result.next()){ array1[0] = result.getString("Res1"); array1[1] = result.getString("Res2"); vector1.addElement(array1); array1 = new String[2];} for(int i = 0;i < vector1.size();i++ ){ String Res1 = null;  String Res2 = null; String[] str1 = (String[])vector1.get(i); Res1 = str1[0]; Res2 = str1[1]; System.out.println("Res1,Res2は" + Res1 + "\t" + Res2);}} if(res == 2){1と同様なので省略・・}} catch(IOException e){ System.out.println(e + "例外が発生しました");} }} メソッドの分割のコツはあるのでしょうか?お勧めの本はございますか? 長くてすいません。

    • ベストアンサー
    • Java
  • 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
  • JSPのループについて・・・

    JSPのループで以下以下のように設定してます。 string ruikeisql3="SELECT SITENKODO,HIDUKE,URIAGE,RIEKI,TOJITU FROM SABISU WHERE SITENKODO='"+no+"'AND YEAR(HIDUKE)="+nen+"AND MONTH(HIDUKE)="+tuki+"order by HIDUKE"; ResultSet RS2=st1.executeQuery(ruikeisql3); RS2.next(); String hiduke=RS2.getString("hiduke"); for(int i=1;i<32;i++){ out.print(i+","); out.print(RS2.getString("uriage")+","); out.print(RS2.getString("rieki")+","); out.print(RS2.getString("toujitu")+","); out.print(RS2.getString("\r"); if(rs2.next()){ 以下省略 実行すると1~31日までの実績が表示されるのですが、1日ごとに一度ループを終わらせて別の計算式を入れたいのですがどのようにしたら良いのか・・・・ お手数ですが宜しくお願いし致します。

このQ&Aのポイント
  • インクを検知できない問題についての質問です。お使いのプリンターで「インクを検知できません」という表示が消えないというトラブルが発生しています。
  • お使いの環境については、Windows10を使用し、無線LANで接続されているとのことです。関連するソフト・アプリについては記載がありません。
  • ご質問はブラザー製品に関するものであり、FAQを参照しても問題が解決されない状況であることが分かります。
回答を見る

専門家に質問してみよう