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

解決


*suzu*  2006-07-12 23:52:37  No: 22490

素朴な疑問です。

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

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

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

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


Fusa  2006-07-13 07:13:49  No: 22491

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 17:52:38  No: 22492

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

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

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

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

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

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


*suzu*  2006-07-13 19:37:51  No: 22493

*suzu*です。

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

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

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

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

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


HOta  2006-07-13 23:00:12  No: 22494

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


*suzu*  2006-07-13 23:44:57  No: 22495

*suzu*です。

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

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


HOta  2006-07-14 02:04:32  No: 22496

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


Syake  2006-07-15 02:49:24  No: 22497

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

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

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


*suzu*  2006-07-18 23:13:03  No: 22498

*suzu*です。

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

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

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

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


*suzu*  2006-07-18 23:13:39  No: 22499

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加