小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


ADODB.RecordsetでRecordCountを取得する

はじめに

レガシーASP(クラシックASP)で、SQLを発行してデータベースからデータを取得する際に、結果として取得したレコードの件数を取得したい場合があります。このエントリでは、ADODB.RecordsetのRecordCountで正しいレコード数を取得する方法を紹介します。

RecordCountプロパティが-1を返す

レコードの件数を取得するSQL(SELECT COUNT(*) FROM 〜)を使うことも可能ですが、データの取得と同時に件数も取得したいときは、RecordCountプロパティを参照することで、SELECTしたレコードの件数を取得することができます。

しかしながら、通常ではRecordCountプロパティは、-1を返します。これは、CursorLocationがデフォルト(サーバサイドカーソル)になっていることが原因です。

サーバーサイド カーソルを使用して作成したレコードセットに対して RecordCount プロパティを取得しようとしたとき、-1 が返されることがあります。
ActiveX Data Objects (ADO) Version 2.0 においては、CursorType プロパティが adOpenForwardonly (前方スクロール カーソル) または adOpenDynamic (動的カーソル) のときにこの結果が得られます。
[VB] ADO Recordset で RecordCount プロパティが -1 を返す場合 はてなブックマーク - [VB] ADO Recordset で RecordCount プロパティが -1 を返す場合

この問題を回避するには、以下の2つの対処方法のいずれかを行います。

  • サーバーサイド カーソルで、CursorType プロパティに adOpenKeyset もしくは adOpenStatic を使用する。
  • クライアントサイド カーソルを使用する。

サーバーサイド カーソルで、CursorType プロパティに adOpenKeyset もしくは adOpenStatic を使用するか、クライアントサイド カーソルを使用します。クライアントサイド カーソルでは、CursorType の設定値がどのようなものであっても、adOpenStatic のみが適用されます。
[VB] ADO Recordset で RecordCount プロパティが -1 を返す場合 はてなブックマーク - [VB] ADO Recordset で RecordCount プロパティが -1 を返す場合

CursorLocationをクライアントサイドカーソルに変更して、RecordCountを取得する
dim connect, rs, count

Set connect = CreateObject("ADODB.Connection")
connect.Open "xxx"
connect.CursorLocation = 3 ' クライアントサイドカーソルに変更

Set rs = CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM HOGE(NOLOCK)", connect
If rs.eof Then
' 0件の場合の処理

End If
' RecordCountの取得
count = rs.RecordCount

rs.Close
Set rs = Nothing