SSブログ

ADO RecordCountプロパティの使用について考える [ADO]

 過去の記事でRecordCountプロパティを使用しても、正しく結果が得られないことがあると記載しましたが、Microsoftのサポート情報に詳しい説明があったので、試してみました。

 文書番号:194973

 どうやら、RecordsetをOpenする時のCursorTypeパラメタが影響するようです。
 RecordsetOpenについては、以下の記事をご参照下さい。
ADOについて その5 Recordsetオブジェクトのメソッド

 CursorTypeパラメタは、以下の4種類があります。
adOpenDynamic・動的カーソル
adOpenForwardOnly(規定値)・前方専用カーソル
adOpenKeyset・キーセットカーソル
adOpenStatic・静的カーソル

 上記サポート情報によると、CursorTypeプロパティがadOpenKeyset、または adOpenStaticのときに、正しい結果が得られるそうです。

 では、実験です。
 下記のようなテストプログラムを作成しました。

Public Sub subRecordCountTest()

 Dim CnA As New ADODB.Connection
 Dim recA As New ADODB.Recordset

 CnA.Open "PROVIDER=Microsoft.ACE.OLEDB.12.0;DATA SOURCE=D:\***.accdb;Jet OLEDB:System database=C:\***\System.mdw;"

 recA.Open " SELECT * FROM TMTDFK ", CnA, adOpenKeyset, adLockReadOnly
 Debug.Print "adOpenKeyset:", recA.RecordCount
 recA.Close

 recA.Open " SELECT * FROM TMTDFK ", CnA, adOpenStatic, adLockReadOnly
 Debug.Print "adOpenStatic:", recA.RecordCount
 recA.Close

 recA.Open " SELECT * FROM TMTDFK ", CnA, adOpenDynamic, adLockReadOnly
 Debug.Print "adOpenDynamic:", recA.RecordCount
 recA.Close

 recA.Open " SELECT * FROM TMTDFK ", CnA, adOpenForwardOnly, adLockReadOnly
 Debug.Print "adOpenForwardOnly:", recA.RecordCount
 recA.Close

 CnA.Close

End Sub

 実行結果は、こちら。

 サポート情報のとおり、adOpenKeysetadOpenStaticのときに、レコード件数が正しく返されています。
 adOpenDynamicadOpenForwardonlyのときは、-1です。

 この結果から、RecordCountプロパティを使ってレコード件数を調べられるように思われますが、必ずしもそうとは限りませんのでご注意を。
 今回は接続先データベースがACCESS(Jet)で、正しい結果が得られたと言うことです。
 サポート情報の記述にもありますが、データベースによっては、すべてのCursorTypeがサポートされていない場合もあります。その場合は、別のCursorTypeに置き換えられて処理されるそうです。
 ACCESS以外のデータベースではどのようになるかやってみないと分かりません。

 また、RecordCountプロパティのヘルプには、以下の記述があります。
--------引用--------
 Recordset オブジェクトがおよその位置付けをサポートしていない場合、正確な RecordCount の値を返すにはすべてのレコードを取得してカウントする必要があるので、このプロパティが大量のリソースを消費する可能性があります。
--------引用ここまで--------
 どのような条件でこういうことになるかは分かりませんが、こういうこともあるそうです。

 とりあえず、ACCESSでは大丈夫そうと言うことは分かりました。
 ただ、いろんな種類のDBを使う機会がある人は、SELECTでカウントするロジックを使用した方が、後々安全に使い回せると思います。


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

nice! 0

コメント 0

コメントを書く

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

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

トラックバック 0

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

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