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

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

0

ResultSetに入ってる件数は数えられますか?

データベースで取得したデータを
ResultSetに入れました。
この件数を数えることはできますか?

ResultSet RS ←データを入れる処理は省略
while(Rs.next()){
・・・
}

↑今まではwhile文で繰り返してたのですが
for文で繰り返せたらなぁと思いまして・・・

13

回答

92311

閲覧

13件の回答

評価

30

なぜfor文のほうがいいと?

評価

0

すみません。
第一の目的は

取得したデータが1以上あるかないか知りたいのです。

評価

0

う〜んと、単純に計算すればいいだけだと思いますけどね・・・

int count = 0;
ResultSet rs = ・・・;
while(rs.next()){
・・・
count++;
}

こうすると、
データがなければ、countは0のまま
データがあれば、件数分countが加算

となるんですが

評価

0

なるほど・・・

ただ、データが10000件以上あることあるので
処理が重くなってしまわないのか気がかりですが・・・

でも、何が良くて悪いのかわからない初心者なので
このやり方が一般的であるのなら
これでやってみます〜

ありがとうございます★

評価

20

単にレコードの有無を確認できればいいなら、

boolean isExists = rs.next();

でいいのでは?

それと、DBMSによってはSQLで抽出するレコード数を制限できる。

評価

0


boolean isExists = rs.next();

↑これ
イイですね。

ResultSetって
「最初の行から最後の行へ向かって 1 回だけ実行できる」ようなので
whileで件数を数えてしまうと
もう一度データを取得しないといけないようで・・・

評価

0

自分も昔調べましたが、ResultSetからの件数取得は出来ませんでした。
なので、わざわざ
SELECT COUNT(*) FROM some_tbl
SELECT * FROM some_tbl
というSQL文を別々で実行してます。

ちなみに、
> whileで件数を数えてしまうと
> もう一度データを取得しないといけないようで・・・
rs.beforeFirst()とかrs.first()でカーソルを初期化できますよ。

評価

150

これじゃダメですか?

rs.last();
int cnt = rs.getRow();

rs.first();
for(int i= 0; i < cnt; i++){
  ・・・・
}

評価

0

逆方向に移動できるかってDBMSによらなかったっけ?

評価

0

逆方向カーソルはDBのサポートいるね。
単方向のカーソルだと、件数が多くても、
1回読めば捨てるだけなので、大抵大丈夫なんだけど、
逆方向をサポートしようとすると、一気にメモリ消費が多くなるよ。

評価

0

やっぱり使い捨てなんですかね?

rs.first(); ってやったら

「転送専用の結果セットに対する操作が向こうです。:first」

って出てしまいました・・・。

評価

0

ところでexecuteQuery()にResultSet.TYPE_SCROLL_INSENSITIVEとか指定してる…?
DBが対応しててもデフォルトでは順方向だけになると思うけど。

評価

0

createStatement()ですはい。

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