電脳リアルタイム通信 ONLINE
DENNOU REALTIME TSUUSHIN ONLINE.

■データアクセス・コンポーネント編
   ――ADOを使ってRecordsetの
             レコード総数を数える

Q.
 前ページの回答では、DAOではRecordCountプロパティが正しい値を示さない場合があると説明されていましたが、ADOでも事情は同じでしょうか?

A.
 ADOのRecordsetオブジェクトにもDAOと同じようにRecordCountプロパティがあります。
 得られる結果がレコードセットのタイプによって異なるという性質も同じです。しかし、その動作はDAOとはいくぶん異なっています。

 ADOでは、さまざまなデータソースに対してアクセスすることができます。そのため、ADOに用意されている機能であっても、使用するデータ・プロバイダやレコードセットのタイプによって、サポートされている場合とされていない場合があります。

 ある機能がそのレコードセットで使用できるかどうかは、RecordsetのSupportsメソッドで調べると分かります。
 ただし、このメソッドを使う場合には、そのレコードセットが実際にオープンしている必要があります。RecordCountが正しい値を返すのは、Supports("adApproxPosition") か Supports("adBookmark")のどちらかがTrueになっている場合です。

 具体的には、次のようになります。

RecordsetのCursorLocation = adUseClientのとき
 すべての場合で、RecordCountは正しい値を返す。

RecordsetのCursorLocation = adUseServerのとき(デフォルト)
 レコードセットのCursorType = adOpenKeyset / adOpenStaticのとき
RecordCountは正しい値を返す。
 レコードセットのCursorType = adOpenForwardOnly / adOpenDynamicのとき
RecordCountは-1となり、正しい値を返さない。

 ADOでRecordCountが正しく取得できるとき、DAOの場合とは異なり、MoveLastなどを実行しなくても、開いた直後から正しい値を得ることができます。

 なお、adpでMSDE/SQL Serverをデータ・エンジンとして利用している場合には、CursorLocation = adUseServerでCursorType = adOpenDynamicのとき、MoveLastすることでRecordCountを得ることができます(DAOの場合とほぼ同じ)。
 ただし、Access adpでは、現在開いているデータベースにはadUseClientで接続していますので、adUseServerを使用するためには、新しいConnectionを作成する必要があります。
 また、ストアド・プロシージャをもとにしたレコードセットでは、RecordCountプロパティは使えません。

前ページ 2/3 次ページ

本サイト掲載の記事・写真等の無断での転載・複写を禁じます。
本ページは、技術評論社様のご好意により掲載許可をいただいたものです。 
技術評論社

Copyright(c)GIJYUTSU-HYORON Co., Ltd. All rights reserved.