ADO RecordCountプロパティの使用について考える [ADO]
過去の記事でRecordCountプロパティを使用しても、正しく結果が得られないことがあると記載しましたが、Microsoftのサポート情報に詳しい説明があったので、試してみました。
文書番号:194973
どうやら、RecordsetをOpenする時のCursorTypeパラメタが影響するようです。
RecordsetのOpenについては、以下の記事をご参照下さい。
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
実行結果は、こちら。
サポート情報のとおり、adOpenKeysetとadOpenStaticのときに、レコード件数が正しく返されています。
adOpenDynamicとadOpenForwardonlyのときは、-1です。
この結果から、RecordCountプロパティを使ってレコード件数を調べられるように思われますが、必ずしもそうとは限りませんのでご注意を。
今回は接続先データベースがACCESS(Jet)で、正しい結果が得られたと言うことです。
サポート情報の記述にもありますが、データベースによっては、すべてのCursorTypeがサポートされていない場合もあります。その場合は、別のCursorTypeに置き換えられて処理されるそうです。
ACCESS以外のデータベースではどのようになるかやってみないと分かりません。
また、RecordCountプロパティのヘルプには、以下の記述があります。
--------引用--------
Recordset オブジェクトがおよその位置付けをサポートしていない場合、正確な RecordCount の値を返すにはすべてのレコードを取得してカウントする必要があるので、このプロパティが大量のリソースを消費する可能性があります。
--------引用ここまで--------
どのような条件でこういうことになるかは分かりませんが、こういうこともあるそうです。
とりあえず、ACCESSでは大丈夫そうと言うことは分かりました。
ただ、いろんな種類のDBを使う機会がある人は、SELECTでカウントするロジックを使用した方が、後々安全に使い回せると思います。
コメント 0