Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

関数内で取得したResultSetを使いたい・・・

ResultSetを引数にもつqueryという関数があります。
この関数を実行した場合、
その関数内ではRsはScrollableResultSetという値が入っているのですが
その関数を抜けたあとはnullになってしまいます。
関数で取得したデータを保持することはできないのでしょうか?

<呼出元>
ResultSet Rs = null;
int i = op.query(sql, Rs, Oconn);


<呼出先関数>
public int query(String sql,ResultSet Rs,Connection conn){
  try{   
   Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
   Rs = stmt.executeQuery(sql);

   //エラー時
   if(Rs == null){
    return -1;
   }
   //データが取得できなかったとき
   boolean isExists = Rs.next();
   if(isExists == false){
    return 1;
   }
   //正常取得
   Rs.first();
   return 0;
   
  }catch(Exception e){
   errMsg=e.getMessage();
   return -2;
  }
}

9

回答

17027

閲覧

9件の回答

評価

0

>その関数を抜けたあとはnullになってしまいます。
その「メソッド」の外でnull以外であったことはないんだけど…。

ResultSetに限らないけど、値を2つ戻したいならそれをメンバーにしたクラスを返せば?

評価

0

>その「メソッド」の外でnull以外であったことはないんだけど…。

メソッドで引数を渡して、
メソッド内で変換して、
その値を返すなんてことはできないのですか?

評価

0

>その値を返すなんてことはできないのですか?
2行目の意味を考えた?

そもそも、メソッドの外で宣言したRs = nullとメソッドの引数Rsは別のもの(コピー)、という認識はありますか。

評価

0

参照渡しとはいえども、
参照先を指している参照変数そのものは複製されますよ。

それに、移譲先でSQLを実行するのは、私なら勧めませんね。
データクラス生成メソッドに委譲するにしても、
ResultSetは、委譲前に取得します。

評価

0

>それに、移譲先でSQLを実行するのは、私なら勧めませんね。
>データクラス生成メソッドに委譲するにしても、
>ResultSetは、委譲前に取得します。

それって、

   Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
   Rs = stmt.executeQuery(sql);

↑この部分を
メソッドの中には書かないってことですか?

評価

0

そうそう。
Rsを作るのがメソッドの外であれば、実体が同じなのでメソッド内での操作は反映されている。

評価

0

ついでにいうと、ResultSet#next()も、委譲前に実行します。
移譲先で実行するのは、絶対にgetterメソッドだけ。

評価

0

多分大事なことを忘れています。
ResultSetの生存期間についてJavadocを読んで見てください。
Statement オブジェクトが閉じられるとき・・・
と書いてあります、いまのソースではたとえResultSetオブジェクトを受け取ったとしても、このメソッドが終わった時点でStatementもなくなるためResultSetも使えなくなります。

評価

0

ResultSetをメソッドで取ってくるんじゃなくて、
実行すべきSQL文をメソッドで取ってくるようにすれば?

ん〜、趣旨変わっちゃってるな。

返り値intの定義で1回、帰ってきてから1回で、結果を2回も判定なんて、
C(とは限らんか)で経験積んだ人が書きそうなコードだね。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。