Recordset オブジェクト (ADO)

ベース テーブルのレコード セット全体または実行されたコマンドの結果を表します。 Recordset オブジェクトでは常に、セット内の 1 つのレコードのみが現在のレコードとして参照されます。

注釈

Recordset オブジェクトは、プロバイダーからのデータを操作するために使用します。 ADO を使用する場合は、Recordset オブジェクトを使用してほぼすべてのデータを操作します。 すべての Recordset オブジェクトは、レコード (行) とフィールド (列) で構成されます。 プロバイダーでサポートされる機能によっては、Recordset の一部のメソッドまたはプロパティを使用できない場合があります。

ADODB.Recordset は、Recordset オブジェクトを作成するときに使用する必要がある ProgID です。 古くなった ADOR.Recordset ProgID を参照する既存のアプリケーションは再コンパイルしなくても引き続き機能しますが、新たな開発では ADODB.Recordset を参照する必要があります。

ADO では次の 4 種類のカーソルが定義されています。

  • 動的カーソル: 他のユーザーによる追加、変更、削除を表示でき、Recordset 内でのブックマークに依存しないあらゆる種類の移動が可能です。また、プロバイダーがサポートしていれば、ブックマークを使用できます。

  • キーセット カーソル: 他のユーザーが追加したレコードを表示できない点と、他のユーザーが削除したレコードにアクセスできない点を除いて、動的カーソルと同様に動作します。 他のユーザーによるデータの変更は引き続き表示されます。 常にブックマークがサポートされるため、Recordset 内でのあらゆる種類の移動が可能です。

  • 静的カーソル: データの検索やレポートの生成に使用する一連のレコードの静的コピーを提供します。常にブックマークを使用できるため、Recordset 内でのあらゆる種類の移動が可能です。 他のユーザーによる追加、変更、または削除は表示されません。 クライアント側の Recordset オブジェクトを開いたときに使用できるのは、この種類のカーソルだけです。

  • 順方向専用カーソル: Recordset 内を順方向にのみスクロールできます。 他のユーザーによる追加、変更、または削除は表示されません。 Recordset 内を 1 回通過するだけでよい場合は、これによってパフォーマンスが向上します。

Recordset を開く前に CursorType プロパティを設定してカーソルの種類を選択するか、Open メソッドで引数 CursorType を渡します。 プロバイダーによっては、全種類のカーソルがサポートされない場合があります。 プロバイダーのドキュメントを確認してください。 カーソルの種類を指定しない場合は、既定で順方向専用カーソルが開きます。

CursorLocation プロパティを adUseClient に設定して Recordset を開いた場合、返された Recordset オブジェクトでは Field オブジェクトの UnderlyingValue プロパティを使用できません。 併用するプロバイダーによっては (たとえば Microsoft ODBC Provider for OLE DB と Microsoft SQL Server を組み合わせた場合)、Open メソッドで接続文字列を渡すことで、以前に定義した Connection オブジェクトとは別に Recordset オブジェクトを作成できます。 この場合も Connection オブジェクトは作成されますが、そのオブジェクトがオブジェクト変数に割り当てられることはありません。 ただし、同じ接続上で複数の Recordset オブジェクトを開く場合は、Connection オブジェクトを明示的に作成して開く必要があります。これにより Connection オブジェクトがオブジェクト変数に割り当てられます。 Recordset オブジェクトを開くときにこのオブジェクト変数を使用しなかった場合は、同じ接続文字列を渡しても、ADO で新しい Recordset ごとに新しい Connection オブジェクトが作成されます。

Recordset オブジェクトは必要な数だけ作成できます。

Recordset を開くと、1 番目のレコード (存在する場合) が現在のレコードの位置となり、BOF プロパティと EOF プロパティが False に設定されます。 レコードがない場合は、BOF プロパティと EOF プロパティが True に設定されます。

MoveFirstMoveLastMoveNextMovePrevious の各メソッド、Move メソッド、AbsolutePositionAbsolutePageFilter の各プロパティを使用して、現在のレコードの位置を変更できます (プロバイダーが関連機能をサポートしていると想定)。 順方向専用の Recordset オブジェクトでは、MoveNext メソッドのみがサポートされます。 Move メソッドを使用して各レコードにアクセス (または Recordset を列挙) する場合は、BOF プロパティと EOF プロパティを使用して、Recordset の先頭または末尾を超えて移動したかどうかを確認できます。

Recordset オブジェクトの機能を使用する前に、オブジェクトで Supports メソッドを呼び出して、その機能がサポートされているか使用可能であることを確認する必要があります。 Supports メソッドから false が返された場合は、その機能を使用しないでください。 たとえば、MovePrevious メソッドは、Recordset.Supports(adMovePrevious) から True が返された場合にのみ使用できます。 そうでない場合はエラーが発生します。これは、Recordset オブジェクトが閉じられて、インスタンスで機能が使用不可になった可能性があるためです。 関心のある機能がサポートされていない場合も、Supports から false が返されます。 この場合は、Recordset オブジェクトで対応するプロパティやメソッドを呼び出さないようにする必要があります。

Recordset オブジェクトは、即時とバッチの 2 種類の更新をサポートします。 即時更新では、Update メソッドを呼び出すと、データに対するすべての変更が、基になるデータ ソースに直ちに書き込まれます。 また、AddNew メソッドと Update メソッドで値の配列をパラメーターとして渡し、レコード内の複数のフィールドを同時に更新することもできます。

プロバイダーがバッチ更新をサポートしている場合は、プロバイダーで複数のレコードに対する変更をキャッシュし、その後に UpdateBatch メソッドでデータベースを 1 回だけ呼び出してそれらの変更を送信できます。 これは、AddNewUpdateDelete の各メソッドで行われた変更に適用されます。 UpdateBatch メソッドを呼び出した後に、Status プロパティを使用して、解決が必要なデータの競合がないかどうかを確認できます。

注意

Command オブジェクトを使用せずにクエリを実行するには、Recordset オブジェクトの Open メソッドにクエリ文字列を渡します。 ただし、コマンド テキストを保持して再実行する場合、またはクエリ パラメーターを使用する場合は、Command オブジェクトが必要です。

Mode プロパティは、アクセス許可を制御します。

Fields コレクションは、Recordset オブジェクトの既定のメンバーです。 結果として、次の 2 つのコード ステートメントは同じになります。

Debug.Print objRs.Fields.Item(0)  ' Both statements print   
Debug.Print objRs(0)              '  the Value of Item(0).  

Recordset オブジェクトがプロセス間で渡されるときは、rowset の値のみがマーシャリングされ、Recordset オブジェクトのプロパティは無視されます。 マーシャリングが解除されるときに、新しく作成された Recordset オブジェクトに rowset がアンパックされ、同時にそのプロパティが既定値に設定されます。

Recordset オブジェクトでは、安全にスクリプトを作成することができます。

このセクションでは、次のトピックについて説明します。

参照

Connection オブジェクト (ADO)
Fields コレクション (ADO)
Properties コレクション (ADO)
付録 A: プロバイダー