So-net無料ブログ作成

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でカウントするロジックを使用した方が、後々安全に使い回せると思います。



【2万円から3万円の、格安ホームページ作成サービス】

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

nice! 0

コメント 0

コメントを書く

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

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

トラックバック 0

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