TQuery.RecordCountが〔-1〕なのはどうして?

解決


*suzu*  2006-07-12 14:52:37  No: 22490  IP: 192.*.*.*

素朴な疑問です。

SELECT文を発行したクエリで、
データは条件通り抽出されているにも関わらず、
QryWork.RecordCountってやったら〔-1〕が返る、
という現象が発生しています。

とりあえず、同条件でデータ件数を取得する別クエリを作って
件数取得はしたのですが〔-1〕が返るワケが知りたいです。

もし空(Empty)なら〔0〕ではないかと思うのですが。
実際は空ではないから件数が戻ればいいのに、ナゼ〔-1〕?

ご存知の方、どうかどうかご教示くださいませ。

編集 削除
Fusa  2006-07-12 22:13:49  No: 22491  IP: 192.*.*.*

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文で回して
自分でカウントさせる方がいいと思います。

編集 削除
ん?  2006-07-13 08:52:38  No: 22492  IP: 192.*.*.*

例えばというか、MS Accessしか知らないのですが・・・

MS Access は、-1どころか、まったく当てにならない値になる。
ただし、MoveLast(で正しい?)等で、最後までレコード移動すると、RecordCountには正しい値が入る。

内部的に、Fusaさん曰く
> while文で回して自分でカウントさせる方がいいと思います。
こういうことをしているらしい。

これは、Access97とか2000の頃、ちょっと弄んでいた時期に学んだことです(ちょっとうろ覚え気味)。

古い情報なので、現バージョンにあてはまるかわからないのですが、
それ以来、RecordCountは信用していません。

一応、Oracle + BDE で、正しい値が返ってきているっぽいのですが、
「SELECT COUNT(*)」を使うように心がけています。

編集 削除
*suzu*  2006-07-13 10:37:51  No: 22493  IP: 192.*.*.*

*suzu*です。

Fusa様。
  ご返信ありがとうございます。
  使うななんて言われると、余計に使いたくなります(笑)
  という冗談はさておき。
  ボーランド自体が使わないほうがいいと言っているなら、
  そりゃ使わないほうがベストですよね。
  while文で回して、ですね。

ん?様。
  ご返信ありがとうございます。
  実は、私が試した環境が〔Oracle9iR2+BDE〕なのです。
  過去には問題なく件数が取得できていたのですが、
  今回初めて〔-1〕などという値が返ってきちゃいました。
  一応私も「SELECT COUNT(*)」を使うようにしています。


内部的にはwhile文でカウントですかー。
そりゃトラフィックも発生するわけで。

じゃあ〔-1〕って値はなんなんだろうと...。

うーん...。
私は、ほぼ素人なのでテキトーなことを言っちゃいますが、
例えば、while文を受けて
「whileするためのメモリを確保できなかった為〔-1〕が返ってくる」とか
そんな感じなんでしょうか?

編集 削除
HOta  2006-07-13 14:00:12  No: 22494  IP: 192.*.*.*

RecordCountはRDBMSでは保証されていません。
SELECT COUNT(*)を使いましょう。

編集 削除
*suzu*  2006-07-13 14:44:57  No: 22495  IP: 192.*.*.*

*suzu*です。

HOta様。
  ご返信ありがとうございます。
  「SELECT COUNT(*)」、心得ております。
  RDBMSでは保証されていないのですか。
  と、なると...。
  保証されているもの(RDBMSぢゃないヤツ…って何?!)も
  あるわけですね。


〔-1〕が返ってきたのは『たまたま』であって、
何かしらの原因があって〔-1〕が返ってきたわけではナイのでしょうか。
もしかしたら〔-1〕ではなく
もしかすると〔9,999,999,999〕が返ってくる可能性もあった、
ということ...?

編集 削除
HOta  2006-07-13 17:04:32  No: 22496  IP: 192.*.*.*

RecordCountは古いローカルDB(dBaseやParadox等)でサポートされていたため、名残として残っています。
双方向のカーソルを持つCliantDataSetなどでしたら、最後の行までカーソルを動かした後は使えるかもしれません。

編集 削除
Syake  2006-07-14 17:49:24  No: 22497  IP: 192.*.*.*

RecordCount = -1
CursorTypeで結果は異なります。
前方専用カーソル、動的カーソルで取得した場合は「-1」を必ず返します。
前方専用カーソルは末尾に達しないとわからないし、動的カーソルでは一定
してるとは限らないですから。(当たり前か・・・)
だから動的カーソルを使うのに「SELECT COUNT(*)・・・」は動的カーソルを
使う目的からでは、無意味と言うことになります。

静的カーソルであれば、取得したレコード件数を正しく返します。
静的カーソルは、結果セットを返すときに既に件数を知っているからカーソ
ルを末尾にする必要もありません。

但しこの内容は、ADOですが何かの参考になれば・・・

編集 削除
*suzu*  2006-07-18 14:13:03  No: 22498  IP: 192.*.*.*

*suzu*です。

HOta様。
 ご返信ありがとうございます。
 なるほどですー。
 ありがとうございました!

Syake様。
 ご返信ありがとうございます。
 こちらも、なるほどです。
 ありがとうございました!

やっと理解できました{恥

愚問にお付き合いいただき、
本当にありがとうございましたm(_ _ )m

編集 削除
*suzu*  2006-07-18 14:13:39  No: 22499  IP: 192.*.*.*

解決チェックし忘れましたです{汗

編集 削除