素朴な疑問です。
SELECT文を発行したクエリで、
データは条件通り抽出されているにも関わらず、
QryWork.RecordCountってやったら〔-1〕が返る、
という現象が発生しています。
とりあえず、同条件でデータ件数を取得する別クエリを作って
件数取得はしたのですが〔-1〕が返るワケが知りたいです。
もし空(Empty)なら〔0〕ではないかと思うのですが。
実際は空ではないから件数が戻ればいいのに、ナゼ〔-1〕?
ご存知の方、どうかどうかご教示くださいませ。
RecordCountが各DB接続にたいしてどういう実装になっているか
わかりませんが。
RecordCountは使わない方が無難です。
昔、正しい値を取得できなくて痛い目にあいました。
Borland:セミナー–第1回 ボーランドデベロッパーキャンプ開催レポート
http://www.borland.com/jp/events/20060525_borland_developer_camp_vol1_report.html
こちらの、
http://www.borland.com/resources/jp/pdf/events/devcamp01_t2.pdf
この資料の4ページ目にも
> RecordCount プロパティは使わない。
> 􀂃レコード数を取得するためにトラフィックが発生
> 􀂃レコード数を取得は「SELECT COUNT(*)」文でチェックする
> 􀂃結果セットのレコードの有無は、Eof プロパティでチェックする
と書かれています。
誤動作する、とは書かれていませんが
for文で書くのではなく、while文で回して
自分でカウントさせる方がいいと思います。
例えばというか、MS Accessしか知らないのですが・・・
MS Access は、-1どころか、まったく当てにならない値になる。
ただし、MoveLast(で正しい?)等で、最後までレコード移動すると、RecordCountには正しい値が入る。
内部的に、Fusaさん曰く
> while文で回して自分でカウントさせる方がいいと思います。
こういうことをしているらしい。
これは、Access97とか2000の頃、ちょっと弄んでいた時期に学んだことです(ちょっとうろ覚え気味)。
古い情報なので、現バージョンにあてはまるかわからないのですが、
それ以来、RecordCountは信用していません。
一応、Oracle + BDE で、正しい値が返ってきているっぽいのですが、
「SELECT COUNT(*)」を使うように心がけています。
*suzu*です。
Fusa様。
ご返信ありがとうございます。
使うななんて言われると、余計に使いたくなります(笑)
という冗談はさておき。
ボーランド自体が使わないほうがいいと言っているなら、
そりゃ使わないほうがベストですよね。
while文で回して、ですね。
ん?様。
ご返信ありがとうございます。
実は、私が試した環境が〔Oracle9iR2+BDE〕なのです。
過去には問題なく件数が取得できていたのですが、
今回初めて〔-1〕などという値が返ってきちゃいました。
一応私も「SELECT COUNT(*)」を使うようにしています。
内部的にはwhile文でカウントですかー。
そりゃトラフィックも発生するわけで。
じゃあ〔-1〕って値はなんなんだろうと...。
うーん...。
私は、ほぼ素人なのでテキトーなことを言っちゃいますが、
例えば、while文を受けて
「whileするためのメモリを確保できなかった為〔-1〕が返ってくる」とか
そんな感じなんでしょうか?
RecordCountはRDBMSでは保証されていません。
SELECT COUNT(*)を使いましょう。
*suzu*です。
HOta様。
ご返信ありがとうございます。
「SELECT COUNT(*)」、心得ております。
RDBMSでは保証されていないのですか。
と、なると...。
保証されているもの(RDBMSぢゃないヤツ…って何?!)も
あるわけですね。
〔-1〕が返ってきたのは『たまたま』であって、
何かしらの原因があって〔-1〕が返ってきたわけではナイのでしょうか。
もしかしたら〔-1〕ではなく
もしかすると〔9,999,999,999〕が返ってくる可能性もあった、
ということ...?
RecordCountは古いローカルDB(dBaseやParadox等)でサポートされていたため、名残として残っています。
双方向のカーソルを持つCliantDataSetなどでしたら、最後の行までカーソルを動かした後は使えるかもしれません。
RecordCount = -1
CursorTypeで結果は異なります。
前方専用カーソル、動的カーソルで取得した場合は「-1」を必ず返します。
前方専用カーソルは末尾に達しないとわからないし、動的カーソルでは一定
してるとは限らないですから。(当たり前か・・・)
だから動的カーソルを使うのに「SELECT COUNT(*)・・・」は動的カーソルを
使う目的からでは、無意味と言うことになります。
静的カーソルであれば、取得したレコード件数を正しく返します。
静的カーソルは、結果セットを返すときに既に件数を知っているからカーソ
ルを末尾にする必要もありません。
但しこの内容は、ADOですが何かの参考になれば・・・
*suzu*です。
HOta様。
ご返信ありがとうございます。
なるほどですー。
ありがとうございました!
Syake様。
ご返信ありがとうございます。
こちらも、なるほどです。
ありがとうございました!
やっと理解できました{恥
愚問にお付き合いいただき、
本当にありがとうございましたm(_ _ )m
解決チェックし忘れましたです{汗
ツイート | ![]() |