Recordset オブジェクトの基本
Microsoft Office 2000/Visual Basic プログラマーズ ガイド |
Visual Basic または VBScript コードを使用してデータベースのレコードを操作するには、ADO Recordset オブジェクトを使用します。Recordset オブジェクトは、1 つのテーブルまたはコマンド (SQL の構文、Access クエリや SQL サーバー ストアド プロシージャなど) の実行で返されたレコードのセットからのレコードを表します。
ADO の Recordset オブジェクトは以下の 3 つのメソッドのいずれかを使用して開きます。
Connection オブジェクトの Execute メソッド
Command オブジェクトの Execute メソッド
Recordset オブジェクトの Open メソッド
各メソッドの構文は以下の通りです。
Set recordset = connection.Execute ([CommandText, [RecordsAffected, [Options]]])
Set recordset = command.Execute ([RecordsAffected, [Parameters, [Options]]])
recordset.Open [Source, [ActiveConnection, [CursorType, [LockType, [Options]]]]]
Connection または Command オブジェクトの Execute メソッドを使用すると Recordset オブジェクトを返しますが、これらのメソッドは基本的にはレコードを返さないコマンド (一般的には SQL の構文) の実行を目的としたもので、Access には、アクション クエリというクエリがあります。これらをレコードのセットを返すために使用すると、前方スクロール、読み取り専用カーソルの Recordset オブジェクトのみが作成されます。これ以外のカーソルの種類を指定することはできません。カーソルの種類の詳細については、この章の「カーソルの種類を指定する」を参照してください。
また、Command オブジェクトは Recordset オブジェクトの Open メソッドへ Source 引数として渡すことができ、以下の場合に有効です。
Command オブジェクトの Prepared プロパティを使用して、コマンドを最適化およびあらかじめコンパイルすることが可能。プロシージャの適用範囲内で Command オブジェクトを何度も使用する場合は、このプロパティにより作成したプロシージャのパフォーマンスが最適化されます。
Command オブジェクトは、クエリに効果的に再利用できるパラメータを与える場合に必要。
Command オブジェクトのこれらのアプリケーションについてはこの章で説明されています。次のトピックでは、Recordset オブジェクトを開く時、さらにオプションと柔軟性を提供する Recordset オブジェクトの Open メソッドの使用方法について説明します。
Recordset オブジェクトの Open メソッドを使用する
ADO Recordset オブジェクトの Open メソッドの構文は以下の通りです。
recordset.Open Source, ActiveConnection, CursorType, LockType, Options
ほかの Visual Basic メソッドと同様、Open メソッドの各引数を位置引数または名前付き引数として渡すことができます。また、Options 引数を除く Open メソッドの各引数は、Open メソッドを呼び出す前に、Recordset オブジェクトに対応するプロパティを設定して指定することも可能です。たとえば、以下のコードではデータベース接続およびカーソルの種類を Recordset オブジェクトを開く前に ActiveConnection と CursorType プロパティを設定して指定し、その後データソースの名前を名前付き引数として Open メソッドへ渡します。
cnn = CurrentProject.Connection
Set rst = New ADODB.Recordset
With rst
.ActiveConnection = cnn
.CursorType = adOpenKeyset
.Open Source:= "Employees"
End With
片方のメソッドが優れているということはなく、いずれかのメソッド、あるいは両方を使用することが可能です。
次の表では、Open メソッドの各引数について説明します。
引数 | 説明 |
Source | 任意に使用。有効な Command オブジェクト変数名、SQL ステートメント、テーブル名、クエリ名 (Access)、ストアド プロシージャ名 (SQL サーバー) または Recordset オブジェクトの Save メソッドを使用して保存済の Recordset オブジェクトのファイル名。 |
ActiveConnection | 任意に使用。有効な Command オブジェクト変数名、接続テキストパラメータを含む文字列、また、現在の Access データベースに関連する Recordset オブジェクトを作成している場合、この引数に CurrentProject.Connection を渡すことができます。 |
CursorType | 任意に使用。Recordset オブジェクトを開く際、プロバイダが使用するカーソルの種類を決定する定数。 |
LockType | 任意に使用。Recordset オブジェクトを開く際、プロバイダが使用するロック (同時実行) の種類を決定する定数。 |
Options | 任意に使用。Command オブジェクト以外を表す場合プロバイダが Source 引数を評価する方法、あるいは Recordset オブジェクトを事前に保存されたファイルから復元しなければならにことを表わす定数。 |
次のトピックでこれらの各引数の使用方法を説明します。
処理するレコードを指定する
Recordset オブジェクトを開く際、Open メソッドの Source 引数を使用して開こうとするレコードのセットを指定します。Source 引数は、レコードを返すコマンドを実行する有効な Command オブジェクト変数名、SQL ステートメント、またはテーブル名になります。Access データベース ファイルに接続している場合は、レコードを返すクエリの名前を渡すことが可能です。また、SQL サーバー データベースに接続している場合は、行を返すストアド プロシージャの名前を渡すことができます。
Command オブジェクト以外を渡す場合は、Open メソッドの ActiveConnection 引数を使用してデータベースへの接続方法を指定します。
Command オブジェクトを Source 引数として渡す前に、その ActiveConnection プロパティまたは引数が、有効な Connection オブジェクトか接続テキストに設定されていなければなりません。Command オブジェクトを Source 引数へ渡し、ActiveConnection 引数も渡すと、エラーが発生します。
次のコードはテーブル名を含む文字列変数を Source 引数として渡します。
rst.Open Source:=strSourceTable
Recordset オブジェクト変数を接続する
Microsoft Jet 4.0 および SQL サーバー OLE DB プロバイダなどの OLE DB プロバイダを使用する場合、Open メソッドの ActiveConnection 引数を使用して既に定義されている Connection オブジェクトの Recordset オブジェクトを別に作成し、接続テキストを渡すことができます。ADO は Connection オブジェクトを作成しますが、そのオブジェクトのオブジェクト変数への割り当てはしません。たとえば、次のコードでは接続テキストを Open メソッドへ渡して Recordset オブジェクトを開きます。
Dim rstFieldData As ADODB.Recordset
Dim strConnect As String
Dim strSQL As String
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=C:\Program Files\Microsoft Office\Office\Samples\Nwind.mdb;"
strSQL = "SELECT * FROM Customers WHERE Region = 'WA'"
Set rstFieldData = New ADODB.Recordset
' カーソル タイプとロック タイプを指定します。
' 次に条件と接続文字列を Open メソッドに渡して
' Recordset オブジェクトを開きます。
With rstFieldData
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Open Source := strSQL, _
ActiveConnection := strConnect, _
Options:= adCmdText
End With
重要 前の例にある SQL ステートメントの WHERE 句は、条件 (Region = 'WA') で指定された値をシングル クォーテーション (') で囲みます。DAO を使用する場合、WHERE 句は値をダブル クォーテーション (") で囲むことができますが、ADO では必ずシングルクォーテーションを使用してください。また、条件に SQL キーワードと同じ名前のフィールド名が含まれる場合、そのフィールド名を角かっこ ([ ]) で囲みます。たとえば、前の例にある条件のフィールド名が Where という名前の場合、WHERE 句の条件は以下のようになります。
WHERE [Where] = 'WA'
しかし、同一の接続で複数の Recordset オブジェクトを開く場合は、Connection オブジェクトを作成し、開いてからオブジェクト変数を Open メソッドに渡すと、パフォーマンスが向上し、使用するリソースの数を押さえることができます。このことから Connection オブジェクトは一度のみ作成されるといえます。接続テキストを渡して Recordset オブジェクトを開く場合、同一の接続テキストを渡しても、ADO では、新しい Recordset オブジェクトのために新しい Connection オブジェクトが作成されます。前の例を、Connection オブジェクトを渡すために記述し直すと以下のようになります。
Dim cnnConnect As ADODB.Connection
Dim rstFieldData As ADODB.Recordset
Dim strConnect As String
Dim strSQL As String
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=C:\Program Files\Microsoft Office\Office\Samples\Nwind.mdb;"
Set cnnConnect = New ADODB.Connection
cnnConnect.Open strConnect
strSQL = "SELECT * FROM Customers WHERE Region = 'WA'"
Set rstFieldData = New ADODB.Recordset
With rstFieldData
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Open Source := strSQL, _
ActiveConnection := cnnConnect, _
Options := adCmdText
End With
カーソルの種類を指定する
与えられた時間で、Recordset オブジェクトはセット内のレコードを 1 つのみ現在のレコードとして参照することができます。レコードのセットをプログラムで操作することを可能にするソフトウェアの機能をカーソルと呼びます。カーソルはデータベースのレコードのセットをスクロールしてレコードを表示、追加、削除または更新するデバイスとみなすことができます。ADO では、Recordset オブジェクトに対するカーソルとして動的、キーセット、静的、および前方スクロールの 4 種類があります。
各カーソルで使用できる機能は、そのカーソルがデータのバージョンおよびメンバーシップをどう扱うかによって決定されます。
データのバージョンは、カーソルで利用できるレコードを表示しているデータがどれだけ新しいかを測定する基準です。動的およびキーセットカーソルで表示されるデータは、ほかのユーザーまたは処理による変更を反映して定期的に更新されます。静的および前方スクロール カーソルで表示されるデータは、Recordset オブジェクトを開いた時点のデータのスナップショットを表しますが、これらのカーソルでも、Resync メソッドを使用してレコードを強制的に更新することは可能です。
メンバーシップは、カーソルで利用できるレコードのセットが新しいレコードの追加や削除を自動的に反映するかどうかを説明します。新規の追加または削除は動的カーソルで利用できるので、そのメンバーシップは固定されませんが、キーセット、静的、および前方スクロール カーソルでは利用できないので、それらのメンバーシップは固定されます。これらのカーソルにあるデータは、Recordset オブジェクトを一度閉じてから開くと更新されますが、Requery メソッドを使用すれば閉じる操作を行わなくても手動で更新することが可能です。
カーソルの種類を指定するには、開く前に Recordset オブジェクトの CursorType プロパティを設定します。たとえば、次のコードは Recordset オブジェクトを作成し、開くカーソルの種類をキーセット カーソルに設定します。
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
rst.CursorType = adOpenKeyset
カーソルの種類は、CursorType 引数を Recordset オブジェクトの Open メソッドに渡して指定することもできます。次のコードはその例です。
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
rst.Open _
Source:=strSourceTable, _
ActiveConnection:=cnn, _
CursorType:=adOpenKeyset
カーソルの種類を指定しない場合、ADO は既定で前方スクロール カーソルを開きます。
メモ プロバイダによってはすべてのカーソルの種類に対応していないものもありますので、プロバイダの説明書で確認してください。Microsoft Jet 4.0 OLE DB プロバイダでサポートされているカーソルの種類については、この章の「DAO Recordset の種類に対応する ADO Recordset の種類」を参照してください。
次の表では各カーソルの機能を説明し、CursorType プロパティを設定または読み込む定数を一覧表示します。
カーソルの種類 | 定数 | 説明 |
動的 | adOpenDynamic | ほかのユーザーが行った新規追加、変更、および削除を反映し、Recordset オブジェクトを通して、ブックマークを使用しない全方向への移動ができます。プロバイダが対応している場合はブックマークも使用できます。Microsoft Jet 4.0 OLE DB プロバイダではこのカーソルはサポートされません。 |
キーセット | adOpenKeyset | 動的カーソルと同様に作動しますが、他のユーザーが追加した新規レコード、または削除したレコードは含まれません。Recordset オブジェクトを開いた時に利用できるレコードに他のユーザーが加えたデータの変更も表示されます。キーセット カーソルは常にブックマークをサポートするため、Recordset オブジェクトを通して全方向移動ができます。 |
静的 | adOpenStatic | 静的ですが、更新可能なレコードのセットのコピーです。常にブックマークがサポートされているので、Recordset オブジェクトを通して全方向にスクロールできます。ほかのユーザーによる追加、変更、削除は、Resync メソッドが呼び出されるまで表示されません。クライアント側 (ADOR) Recordset オブジェクトを開いた場合には、このカーソルのみが使用可能です。 |
前方スクロール | adOpenForwardOnly | 静的と同様に作動しますが、レコードは前方にのみスクロールします。Recordset オブジェクトのパスが 1 つのみの場合、このカーソルによりパフォーマンスが向上します(既定)。
メモ 前方スクロール Recordset オブジェクトの RecordCount プロパティは、ADO が 前方スクロール Recordset オブジェクトのレコード数を決定できないので常に – 1 を返します。Recordset オブジェクトを Access データベースで使用する場合に、有効なレコード数を得るには、キーセット カーソルまたは静的カーソルを使用します。 |
ロックを指定する
LockType プロパティまたは引数では、Recordset オブジェクトのレコードを編集中に使用するロックの種類を指定します。ロックは、マルチユーザー データベースのレコードを編集中にほかのユーザーがレコードに行うことのできる作業を制御するために使用します。LockType プロパティを設定しない場合、読み取り専用ロックが既定として使用され、レコードの編集ができなくなります。Recordset オブジェクトのデータを編集するには、開く前に LockType プロパティを設定するか、Open メソッドへ LockType 引数を渡します。LockType プロパティは、Recordset オブジェクトを開く前、または閉じた後は読み込みおよび書き込みが可能で、開いている間は読み込み専用になります。次の表では、LockType プロパティを設定または読み込むために使用する定数の一覧およびレコード編集中の各ロック機能について説明します。
定数 | 説明 |
adLockReadOnly | 読み取り専用。データの編集はできません。(既定) |
adLockPessimistic | ペシミスティック ロッキング。レコードごと。プロバイダがレコードの編集を確実にするために必要な作業を行います。通常はレコードの編集を開始した時点でデータ ソースのレコードをロックする方法を取ります。Update メソッドで変更を保存するか、CancelUpdate メソッドでキャンセルするまで、ほかのユーザーはデータの読み取りまたは編集をすることができません。 |
adLockOptimistic | オプティミスティック ロッキング。レコードごと。プロバイダは Update メソッドが呼び出されるとレコードをロックします。レコードが開かれている間、ほかのユーザーは同じレコードの読み取り、編集および変更の保存が可能です。 |
adLockBatchOptimistic | オプティミステック バッチ更新。イミディエイト更新モードとは対照に、バッチ更新モードに必要。 |
次のコードを前のコードに追加すると、オプティミスティック ロッキングが指定でき、Recordset オブジェクトの編集が可能になります。
rst.Open _
Source:=strSourceTable, _
ActiveConnection:=cnn, _
CursorType:=adOpenKeyset, _
LockType:=adLockOptimistic
OLE DB プロバイダによっては、全種類のロックをサポートしないものもあります。指定する LockType 設定をプロバイダがサポートしない場合、ほかの種類のロックが代用されます。Recordset オブジェクトで実際に使用できるロック機能を決定するには、adUpdate および adUpdateBatch 定数で Supports メソッドを使用します。Supports メソッドの詳細については、この章の「カーソルの機能を決定する」を参照してください。
ロックおよびその他のマルチユーザー データベースの詳細については、第 16章「マルチユーザー データベース ソリューション」を参照してください。
Source 引数の評価を最適化する
Recordset オブジェクトの Open メソッドへ Source 引数の Command オブジェクト以外のものを渡す場合、Options 引数を使用して Source 引数の評価を最適化することができます。ADO はプロバイダを呼び出し、Source 引数が SQL ステートメント、ストアド プロシージャ、またはテーブル名であるか確定しなければならないため、Options 引数を指定しない場合、パフォーマンスが低下する場合があります。Source 引数に使用するオブジェクトまたはコマンドの種類が判明している場合、Options 引数の設定により、ADO を関連したコードに直接ジャンプさせることができます。以下の定数で Options 引数を指定することが可能です。
定数 | 説明 |
adCmdText | プロバイダが Source 引数をコマンドのテキスト定義として評価する必要があることを示します。 |
adCmdTable | Source 引数で名前を付けられたテーブルの全レコードを返すために ADO が SQL クエリを生成する、必要があることを示します。 |
adCmdTableDirect | プロバイダが Source 引数で名前を付けられたテーブルの全レコードを返す必要があることを示します。 |
adCmdStoredProc | プロバイダが Source 引数をストアド プロシージャとして評価する必要があることを示します。 |
adCmdUnknown | Source 引数のコマンドの種類が不明であることを示します。 |
adCmdFile | 持続的 (保存された) Recordset オブジェクトをが Source 引数で名前を付けれたファイルから復元する必要があることを示します。 |
adAsyncExecute | Source 引数を非同期的に実行する必要があることを示します。 |
adAsyncFetch | CacheSize プロパティで指定された初期数量が取り出された後、残りのレコードを非同期的に取り出す必要があることを示します。 |
次のコードを前のコードへの追加すると、Source 引数がテーブル名として評価されます。
rst.Open _
Source:=strSourceTable, _
ActiveConnection:=cnn, _
CursorType:=adOpenDynamic, _
LockType:=adLockOptimistic, _
Options:=adCmdTableDirect
既定の Options 引数は Recordset オブジェクトに関連する接続がない場合、adCmdFile になります。一般的に、保存された Recordset オブジェクトの場合です。
カーソル位置を指定する
ADO は、サーバー カーソル エンジンおよびクライアント カーソル エンジンの 2 種類のカーソル エンジンをサポートします。カーソル エンジンの位置により ADO Recordset オブジェクトの機能の一部が決定されます。
使用するカーソル エンジンの指定には、Recordset または Connection オブジェクトの CursorLocation プロパティを使用します。サーバー カーソル エンジンを使用する場合は、CursorLocation プロパティを adUseServer に設定し、クライアント カーソル エンジンを使用する場合は、adUseClient に設定します。Recordset オブジェクトのカーソル エンジンを指定するには、Recordset オブジェクトを開く前に CursorLocation プロパティを設定してください。Connection オブジェクトの CursorLocation プロパティを設定する場合、その Connection オブジェクトを使用中に開く任意の Recordset オブジェクトがその接続の設定を引き継ぎます。Access データベースの Connection オブジェクトを開くとき、既定では、CursorLocation プロパティは adUseServer に設定されます。
使用するカーソル エンジン (クライアントまたはサーバー) を決定するにあたり、以下の点を考慮に入れてください。
サーバー カーソル エンジンは、OLE DB プロバイダおよびデータベース エンジン自体により使用可能になります。これは、Access データベースでは、Microsoft Jet 4.0 OLE DB プロバイダおよび Microsoft Jet データベース エンジンで、SQL サーバー データベースにおいては、Microsoft SQL サーバー OLE DB プロバイダおよび SQL サーバーまたは Microsoft Data Engine (MSDE) のいずれかになります。どちらの場合でもデータベース エンジンによりキーセットというキーのセットが作成され、Access データベースの場合はローカルに、SQL サーバー データベースの場合はサーバーに保存されます。データベース エンジンはそのキーセットを使用して Access データベースのレコードを取得およびレコード全体をスクロールします。
クライアント カーソル エンジンは、レコード数が極端に多い場合、特定のレコードをローカルのメモリまたはディスクに保存されている一時テーブルにバッファおよびコピーする OLE DB サービス コンポーネントです。フィールド データに変更を加える、またはクライアント側カーソルで AddNew または Delete メソッドを呼び出すと、ADO は自動的に適切な SQL UPDATE、INSERT、および DELETE ステートメントを生成し、Recordset オブジェクトの更新時にそれらをデータベース エンジンに送ります。
サーバー カーソル エンジンで生成されたカーソルは通常、サーバー側カーソルと呼ばれ、クライアント カーソル エンジンで生成されたカーソルはクライアント側カーソルと呼ばれます。2 つのカーソルの違いは以下の通りです。
サーバー側カーソルで利用できる機能は、使用しているデータベース エンジンおよび OLE DB プロバイダに特定されます。Access データベースにおいては、サーバー側カーソルを使用する Recordset オブジェクトは、一般的にクライアント側カーソルに比べて更新が可能な場合が多く、複数のユーザーによってデータベースを共有する場合、サーバー側カーソルにより、ほかのユーザーが加えた変更が表示されます。
クライアント側カーソルは更新可能なスナップショットと考えることができます。クライアント側カーソルを使用する Recordset オブジェクトの Open メソッドの LockType 引数に adBatchOptimistic 定数を指定すると、UpdateBatch メソッドを使用してデータベースへバッチとして更新を送ることが可能になります。クライアント側カーソルは OLE DB サービス プロバイダであるため、クライアント側カーソルで利用できる機能は、すべてのデータ ソースおよび OLE DB プロバイダを通じて一貫して使用することができます。
原則的に、Access データベースにはサーバー側カーソルを、SQL サーバー データベースにはクライアント側カーソルを使用します。ただし、リモート データベースを使用している場合、または複数のデータベースを使用する際に動作を統一する必要がある場合は、Access データベースでもクライアント側カーソルを使用します。その場合、キャッシュ レコードへ追加の OHP が生成され、Jet データベース エンジンのすべての機能は利用できません。
DAO Recordset の種類に対応する ADO Recordset の種類
ADO Open メソッドの CursorType、LockType、および Options 引数の組み合わせは、返される ADO Recordset オブジェクトの種類を決定します。次は、DAO OpenRecordset メソッドの Type および Options 引数とADO および Microsoft Jet 4.0 OLE DB プロバイダを使用してAccess データベースを使用する際の、ADO Recordset Open メソッドの引数の設定の対応表です。
DAO 引数 | ADO 引数 | |||
Type | Options | CursorType | LockType | Options |
dbOpenDynaset | adOpenKeyset | adLockOptimistic | ||
dbOpenSnapshot | adOpenStatic | adLockReadOnly | ||
dbOpenSnapshot | dbForwardOnly | adOpenForwardOnly | adLockReadOnly | |
dbOpenTable | adOpenKeyset | adLockOptimistic | adCmdTableDirect |
Microsoft Jet 4.0 OLE DB プロバイダは、CursorType および LockType 引数のすべての組み合わせをサポートしているわけではないため、上記の表には ADO Recordset CursorType および LockType 引数の組み合わせのすべては表記されていません。また、サーバー カーソル エンジンまたはクライアント カーソル エンジンの使用を指定する Recordset オブジェクトの CursorLocation プロパティの設定は、Recordset オブジェクトに利用できる機能の種類も決定します。ADO コードにおいて、Microsoft Jet 4.0 OLE DB プロバイダでサポートされていない CursorLocation プロパティ、CursorType および LockType 引数の組み合わせの設定を使用する場合は、サポートされている Recordset オブジェクトを返します。
次の表は、Microsoft Jet 4.0 OLE DB プロバイダでサーバー側カーソルを使用する場合 (CursorLocation = adUseServer) に予想される CursorType および LockType 引数の全組み合わせの結果を示したものです。
CursorType | LockType | 結果 |
adOpenForwardOnly | adLockReadOnly | 1 度に 1 つのレコードを前方にのみスクロールすることが可能です。逆方向にスクロールすると、ADO は Recordset オブジェクトを照会し直し、はじめからやり直します。データの更新はできません。 |
adOpenForwardOnly | adLockOptimistic adLockPessimistic adBatchOptimistic |
ほかの全ロックの種類にキーセット カーソルが返されます。 |
adOpenStatic | adLockReadOnly | Recordset オブジェクトには、データのスクロール可能な、読み取り専用スナップショットが含まれています。ほかのユーザーが行った変更を表示することはできません。 |
adOpenStatic | adLockOptimistic adLockPessimistic adBatchOptimistic |
ほかの全ロックの種類にキーセット カーソルが返されます。 |
adOpenKeyset | adLockReadOnly | Recordset オブジェクトには読み取り専用、スクロール可能なカーソルがあります。更新や削除は表示できますが、ほかのユーザーが加えた挿入は表示できません。Options 引数の Source 引数のテーブル名および Options 引数の adCmdTableDirect 定数を指定することによりRecordset オブジェクトが開かれている場合は、Index プロパティを使用してテーブルのインデックスを使用しレコードをスクロールおよび検索することが可能です。 |
adOpenKeyset | adLockOptimistic | Recordset オブジェクトには更新およびスクロール可能なカーソルがあります。更新や削除は表示できますが、ほかのユーザーが加えた挿入は表示できません。Update メソッドが呼び出されるか、ほかのレコードへ移動するまでは、現在のレコードに行った更新をロックして保存することはできません。Source 引数のテーブル名および Options 引数の adCmdTableDirect 定数を指定することによりRecordset オブジェクトが開かれている場合は、Index プロパティを使用してテーブルのインデックスを使用し、レコードをスクロールおよび検索することが可能です。 |
adOpenKeyset | adBatchOptimistic | Recordset オブジェクトには更新およびスクロール可能なカーソルがあります。サーバー側カーソルを使用する場合、バッチ サイズは 1 つのレコードに限定されます。このため、この種類の Recordset オブジェクトの機能は、UpdateBatch メソッドを呼び出さずに違うレコードに移動する場合に現在のレコードへの更新が自動的に保存されていない場合を除いて、以前の入力に類似します。更新されたレコードは UpdateBatch メソッドが呼び出されない限りロックされません。Source 引数のテーブル名および Options 引数の adCmdTableDirect 定数を指定することにより Recordset オブジェクトが開かれている場合は、Index プロパティを使用してテーブルのインデックスを使用し、レコードをスクロールおよび検索することが可能です。 |
adOpenKeyset | adLockPessimistic | Recordset オブジェクトには更新およびスクロール可能なカーソルがあります。更新や削除は表示できますが、ほかのユーザーが加えた挿入は表示できません。レコードは最初のフィールドが編集された時点でロックされます。Recordset オブジェクトが、Source 引数のテーブル名、および Options 引数の adCmdTableDirect 定数を指定して開かれている場合は、Index プロパティを使用してテーブルのインデックスを使用しレコードをスクロールおよび検索することが可能です。 |
adOpenDynamic | adLockReadOnly | 動的カーソルは、サーバー カーソルエンジンで Access データベースへのサポートはされていません。静的カーソルが代わりに返されます。 |
adOpenDynamic | adLockOptimistic adLockPessimistic adBatchOptimistic |
動的カーソルは、サーバー カーソルエンジンで Access データベースへのサポートはされていません。ほかの全ロックの種類に 動的カーソルの使用を指定すると、キーセット カーソルが与えられますが、CursorType 引数の adOpenDynamic 引数を使用して Recordset オブジェクトを開く場合、ADO は違うメソッドを使用して Recordset オブジェクトを操作します。このため、多数のレコードをスクロールする際、キーセット カーソルの使用してスクロールする場合よりも、パフォーマンスが明らかに向上します。 |
指定なし | adLockReadOnly | CursorType 引数を指定しない場合、静的カーソルが返されます。 |
指定なし | adLockOptimistic adLockPessimistic adBatchOptimistic |
ほかの全ロックの種類用に CursorType 引数を指定しない場合、キーセット カーソルが返されます。 |
Microsoft Jet 4.0 OLE DB プロバイダでクライアント側カーソルを使用する場合 (CursorLocation = adUseClient)、プロバイダは前方スクロール (adOpenForwardOnly)、キーセット (adOpenKeyset)、または動的 (adOpenDynamic) カーソルをサポートしません。CursorType 引数をこれらのいずれかに設定すると、プロバイダが静的 (adOpenStatic) カーソルを返します。クライアント側カーソルでは、CursorType の設定のみが静的 (adOpenStatic) カーソルでサポートされます。次の表は、クライアント カーソル エンジンから静的カーソルで各 LockType 設定を使用する際に予想される結果を示したものです。
LockType | 結果 |
adLockReadOnly | Recordset オブジェクトはデータのスクロール可能なスナップショットを含みます。Requery メソッドを使用しない限り、他のユーザーが行った更新、挿入、または削除を表示することはできません。 |
adLockOptimistic | Recordset オブジェクトはデータのスクロールおよび更新可能なスナップショットを含みます。変更はレコードごとに行います。 |
adBatchOptimistic | Recordset オブジェクトはデータのスクロールおよび更新可能なスナップショットを含みます。変更はパッチにグループ化し、UpdateBatch メソッドを使用して一度に処理することが可能です。 |
adLockPessimistic | ペシミスティック ロッキングはクライアント カーソル エンジンではサポートされていません。オプティミスティック ロッキングが代わりに使用されます。 |
カーソルの機能を決定する
ADO Supports メソッドを使用して、現在の OLE DB プロバイダに対して Recordset オブジェクトを開く際にサポートされる機能の種類を決定することができます。Supports メソッドは、各種 CursorOptions 定数により認識された機能をプロバイダがサポートするかどうかを示すブール型の値を返します。たとえば、adAddNew 定数は現在の Recordset オブジェクトが新規レコード追加のために使用している AddNew メソッドをサポートするかどうかを決定します。
メモ Supports メソッドが使用可能な機能に True を返しても、OLE DB プロバイダがあらゆる状況でその機能を使用できるとは限りません。Supports メソッドは、一定の条件を満たしていることを前提として、プロバイダが指定の機能をサポートすることを単に示すのみです。たとえば、Supports メソッドは、カーソルがマルチテーブル結合に基づき、その一部のフィールドが更新できなくても、Recordset オブジェクトが更新できることを示す場合があります。
Supports メソッドの詳細については、ADO ヘルプを参照してください。任意の OLE DB プロバイダでサポートされている機能を一覧にしたプロシージャの例については、DataAccess.mdb サンプル ファイルの OpenRecordset モジュールにある ProviderSupports プロシージャを参照してください。このファイルは Office 2000 Developer CD-ROM の ODETools\V9\Samples\OPG\Samples\CH14 サブフォルダにあります。