SSブログ

ADOについて その4 Recordsetオブジェクトのプロパティ [ADO]

Recordsetのプロパティについて。

 たくさんありますが、改めて確認してみると、よく使うのはEOFのみですね。

・BOF プロパティ
・EOF プロパティ
 現在読み出しているレコードが、レコードセットの先頭レコードより前、または最後のレコードの後に位置している場合、Trueになります。
 RecordsetOpenして、全レコードを読み出す処理を書く場合、

Do While recA.EOF = False
/*処理いろいろ*/
recA.MoveNext
Loop

と、言う感じで、終わりを検出するのに使います。

以下、使いそうかな、と言う物。

・EditMode プロパティ
 カレントレコードが編集中かどうかを調べます。

adEditNone ・・・ 編集中ではない。
adEditInProgress ・・・ 編集中。(Updateされていない)
adEditAdd ・・・ 新規レコードの編集中。
adEditDelete ・・・ カレントレコードが削除されている状態。

・Source プロパティ
 OpenしたSQL文を参照します。

以下は、使えそうだけど、使わない方が良いんじゃないかと思われる物。

・RecordCount プロパティ
 Recordsetの総レコード数を返します。ただ、特定の条件下でしか正しく取得できません。たいてい-1が返ってきます。
 レコード数を調べたいときは、素直にCount(*)でSelectします。

 これについては、こちらもご参考に。
ADO RecordCountプロパティの使用について考える

・Filter プロパティ
 Recordsetを条件で絞り込みます。
って、最初からSQLのWHERE句に書いておきましょう。

・Sort プロパティ
 Recordsetのソートを行います。
これも、最初からSQLのOrder Byに書いておきましょう。

以下、リファレンス。たくさんありますが、使ったこと無いです。

CursorLocation プロパティ
 カーソルサービスを設定、参照します。
 Connectionオブジェクトのものと同じです。

・AbsolutePage プロパティ
・AbsolutePosition プロパティ
・ActiveCommand プロパティ
・ActiveConnection プロパティ
・Bookmark プロパティ
・CacheSize プロパティ
・CursorType プロパティ
・DataMember プロパティ
・DataSource プロパティ
・Index プロパティ
・LockType プロパティ
・MarshalOptions プロパティ
・MaxRecords プロパティ
・PageCount プロパティ
・PageSize プロパティ
・Properties コレクション
・State プロパティ
・Status プロパティ
・StayInSync プロパティ


nice!(0)  コメント(2)  トラックバック(0) 

nice! 0

コメント 2

まらいや

こんばんは お久しぶりです。

 あれから結構ADOに触れてみてちょっと気付いた点がありましたので書いてみます。既出でありましたらすみません。
 
 レコードセットオブジェクトでオープンした場合。

 レコードカウントは私は結構使用しておりまして、以前だとカーソルロケーションをサーバ側からクライアント側に指定して開いて、まともなレコード数として取得していました。
 でも、カーソルロケを既存のままでも単純な話なんですが、キーセットカーソルで開いたら、正しいレコードカウンと数を返してくれるようです。ダイナミックで開かないといけない場合などは使用不可ですね。苦笑。
 気付いた時はちょっとびっくりでした。

 もうひとつ、コンボボックスを使用している時。 連結できるレコードソースがないと結構苦労するんですが。
 この時も、カーソルロケーションをクライアント側にしてレコードセットを開いたら、そのままSET レコードセットでコンボボックスのレコードセットとして使用可能です。
 こちらは、コンボ使うのタメラッテいたんですが、楽チンになりました。
by まらいや (2012-09-02 23:05) 

NZ

 お久しぶりです。コメントありがとうございます。

 RecordCountについての情報ありがとうございます。CursorLocationやCursorTypeによって変わってくるんですね。勉強になります。CursorLocationとかは、何にどう影響があるのかよくわかってないので、また研究してみたい内容ではあります。(原因不明のエラーに出くわしたとき、CursorLocationをいじくったらうまくいった、と言う程度にしか扱ったことがありません…)
 私もRecordCountを使ってレコード数を取得していた(取得できていた)記憶がありますが、たぶんOracleやSQLServerに接続するようになってから取得できなくなったような気がします。で、確実に取得できる方法に移行してしまいました。

 RecordCountが当てにならないと知ったときは、不便に思いましたが、DBを扱う経験が長くなるにつれて、それも妥当だと思うようになりました。
 たとえば、1億件のデータから1万件を絞り込むようなSQLを発行したとします。
 結果となる1万件のレコードをすべて特定するまで1分かかるとします。
 そして、その結果のレコードを、クライアントに送信するのに、さらに1分かかるとします。
 単純に考えると、レコードを絞り込んで、すべてのレコードを送信完了するまでには、2分かかることになります。

 しかし、クライアントにレコードを送信するのに、1万件すべての絞り込みが完了している必要はありません。
 例えば、1件目が見つかるまでに1秒かかったとします。見つかったレコードを送信しながら、処理を進めたとすると、レコードの絞り込みと、クライアントへのレコードの送信完了にかかる時間は、1分と1秒になります。

 こう考えると、ADOでレコードセットのオープンが完了しても、何件のレコードがSELECTされのかまだ分からない状態になるのではと思います。なので、RecordCountは設定できないのかなと思います。

 上記は私の勝手な想像で、何かしらの資料で裏取りができているわけではないので、その辺ご了承ください。
(Oracleのヒントテキストの説明に、それっぽいことが書いてありました)
by NZ (2012-09-12 01:38) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。
※URL(リンク)は記述できません。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。