MSDN Japan Home > MSDN Library Japan > Microsoft ActiveX Data Objects (ADO) > ADO プログラマーズ ガイド > セクション I: ActiveX Data Objects (ADO) > 第 8 章: カーソルとロックの概要
ADO
カーソルとは
リレーショナル データベースの操作は、完結した行セットに対して行われます。SELECT ステートメントから返される行セットは、そのステートメントの WHERE 句の条件を満たすすべての行から構成されます。ステートメントから返されるこのような完結した行セットを結果セットといいます。アプリケーション、特に対話型のオンライン アプリケーションでは、結果セット全体を 1 単位として効果的に処理できないことがあります。このようなアプリケーションには、一度に 1 行または小さい行ブロックを処理する機能が必要です。カーソルは、このような処理を可能にする、結果セットの拡張機能です。
カーソルは、カーソル ライブラリによって実装されています。カーソル ライブラリは、通常、データベース システムまたはデータ アクセス API の一部として実装されるソフトウェアで、データ ソース (結果セット) から返されるデータの属性の管理に使用されます。それらの属性には、同時実行管理、結果セット内の位置、返される行数、スクロール機能 (結果セット内を前方、後方のいずれか、または両方に移動できるかどうか) などがあります。
カーソルには結果セット内の位置が記録されるので、元のテーブルに結果を返すか返さないかにかかわらず、結果セットとの間で 1 行ごとの操作を複数実行できます。つまり、カーソルは概念的には、データベース内のテーブルに基づく結果セットを返します。カーソルは、コンピュータ画面上の「カーソル」が現在の位置を示すのと同じように、結果セット内の現在位置を示します。
ADO でのカーソルの使用方法を学習する前に、カーソルの概念に精通しておくことは大切です。
カーソルを使って行える処理は次のとおりです。
結果セット内の特定の行に位置付けることができます。
現在の結果セットの位置に基づいて 1 行または行ブロックを取得できます。
結果セット内の現在の位置にある行のデータを変更できます。
ほかのユーザーによって行われたデータ変更をどの程度反映するかを定義できます。
たとえば、買い手に購入可能な製品の一覧を表示するアプリケーションを想定してみてください。買い手は一覧をスクロールして、製品の詳細と価格を確認し、最後に購入する製品を選択します。その後、さらにスクロールして、一覧にあるほかの製品を選択できます。買い手から見れば、画面上に表示された製品が移動するだけですが、アプリケーションではスクロール可能カーソルを使用して、結果セット内を上下に移動しながら参照を行っています。
カーソルは、次のようなさまざまな方法で利用できます。
行なしで動作。
単一テーブル内の一部または全部の行付きで動作。
論理的に結合された複数テーブルの一部または全部の行付きで動作。
カーソル レベルまたはフィールド レベルの読み取り専用または更新可能カーソルとして動作。
前方スクロール カーソル、またはフルスクロール カーソルとして動作。
サーバー上にあるカーソル キーセット付きで動作。
ほかのアプリケーションによる、基になるテーブルの変更 (メンバシップ、並べ替え、挿入、更新、削除など) を反映しながら動作。
サーバー側、あるいはクライアント側のいずれかに存在して動作。
読み取り専用カーソルは結果セットの参照に便利です。一方、読み取り/書き込みカーソルを使うと個々の行の更新を実装できます。ベース テーブルの行を逆ポイントするキーセットを持つ、複雑なカーソルも定義できます。前方にのみ移動する読み取り専用のカーソルもあれば、前後に移動が可能で、ほかのアプリケーションがデータベースに行う変更に基づいて結果セットを動的に更新できるカーソルもあります。
カーソルを使用しなくてもデータのアクセスや更新ができるアプリケーションもあります。これに対し、カーソルを使用すると、行の直接更新をまったく必要としないクエリもあります。データ取得の技法としてカーソルの採用を考慮する場合は非常に慎重に行い、カーソルを採用する場合でも、できるだけ影響の少ないカーソルを選択する必要があります。ストアド プロシージャを使用して結果セットを作成した場合、その結果セットはカーソル編集でも更新メソッドでも更新できません。
同時実行
マルチユーザー アプリケーションで、エンド ユーザーにできるだけ最新のデータを提供することが非常に重要な場合があります。そのようなシステムの従来からある例の 1 つは航空券予約システムで、特定のフライトの 1 つの座席、つまり単一のレコードをめぐって多数のユーザーが競合する可能性があります。したがって、アプリケーションは 1 つのレコードに対する複数の同時操作を処理できる設計にする必要があります。
同時実行がそれほど重要でないアプリケーションもあります。そのような場合は、データを常に最新の状態に保とうとしてコストのかかる方法を使用するのは不適当です。
位置
カーソルには、結果セット内の現在位置も記録されています。カーソル位置は、配列中の特定の位置にある値を指す配列インデックスのような、カレント レコードへのポインタと考えてください。
スクロール機能
アプリケーションで使用するカーソルの種類は、結果セット内を前方の行、または後方の行に移動できるかどうかにも影響します。これをスクロール機能と呼ぶことがあります。結果セット内を前方および後方に移動する機能はカーソルの複雑さを増大させ、実装する場合のコストも高くなります。このため、カーソルにこの機能を持たせるのは必要な場合に限ってください。
プロファイル (個人情報) の管理 |お問い合わせ先 |MSDN Flash ニュースレター
c2007 Microsoft Corporation. All rights reserved. 使用条件 |商標 |プライバシー |日本での個人情報の取り扱い
MSDN Japan Home > MSDN Library Japan > Microsoft ActiveX Data Objects (ADO) > ADO プログラマーズ ガイド > セクション I: ActiveX Data Objects (ADO) > 第 8 章: カーソルとロックの概要
ADO
カーソルの種類
一般的に、アプリケーションでは、必要なデータ アクセス機能を提供する最も単純なカーソルを使用します。基本機能 (前方スクロールのみ、読み取り専用、静的、スクローリング、非バッファリング) 以上のカーソルの拡張機能はすべて、クライアント メモリ、ネットワーク負荷、パフォーマンスのいずれかに悪影響を及ぼします。多くの場合、既定のカーソル オプションを利用すると、アプリケーションの実際の必要を超えた複雑なカーソルが生成されます。
どのカーソルの種類を選択するかは、作成するアプリケーションでの結果セットの利用方法に加えて、結果セットのサイズ、よく使用されるデータの割合、データ変更の反映度、必要なアプリケーション パフォーマンス レベルなどの設計上の考慮点によって決まります。
カーソルの選択で最も基本的な判断基準は、次に示すように、データ変更の必要があるか、データを表示するだけでよいかという点です。
結果セット内をスクロールする必要があるだけでデータを変更しない場合は、前方スクロール カーソル、または静的カーソルを使用します。
結果セットのサイズが非常に大きく、そこから数行だけを選択する必要がある場合は、キーセット カーソルを使用します。
結果セットの内容をすべて同時期に実行を行ったユーザーによる最新の追加、変更、および削除操作と同期させる場合は、動的カーソルを使用します。
各カーソルの種類はそれぞれ別物のように見えます。しかし、それはカーソルの種類の特性とオプションの重複した組み合わせがあるためであり、実際の違いは多くありません。
関連項目
前方スクロール カーソル | 静的カーソル | キーセット カーソル | 動的カーソル
プロファイル (個人情報) の管理 |お問い合わせ先 |MSDN Flash ニュースレター
c2007 Microsoft Corporation. All rights reserved. 使用条件 |商標 |プライバシー |日本での個人情報の取り扱い
MSDN Japan Home > MSDN Library Japan > Microsoft ActiveX Data Objects (ADO) > ADO プログラマーズ ガイド > セクション I: ActiveX Data Objects (ADO) > 第 8 章: カーソルとロックの概要
ADO
カーソルの存在場所の重要性
すべてのカーソルで、データを保持するために一時的なリソースが使用されます。これらのリソースには、メモリ、ディスク ページング ファイル、一時ディスク ファイル、あるいは、データベース内の一時記憶領域さえも含まれることがあります。これらのリソースがクライアント コンピュータに存在する場合、カーソルはクライアント側カーソルと呼ばれます。リソースがサーバー上に存在する場合は、カーソルはサーバー側カーソルと呼ばれます。
クライアント側カーソル
ADO では、adUseClient CursorLocationEnum を使用してクライアント側カーソルを呼び出します。非キーセットのクライアント側カーソルを使用すると、サーバーは結果セット全体をネットワーク経由でクライアント コンピュータに送ります。クライアント コンピュータでは、カーソルと結果セットに必要な一時リソースを用意し、それらを管理します。クライアント側アプリケーションでは、結果セット全体を参照して、必要な行を見つけることができます。
静的およびキーセット駆動型のクライアント側カーソルでは、含まれる行が多すぎると、ワークステーションに過大な負荷がかかることがあります。すべてのカーソル ライブラリで何千行ものカーソルを作成できるとはいえ、そのような巨大な行セットをフェッチする設計のアプリケーションでは、パフォーマンスに問題が生じかねません。これにも例外があります。巨大なクライアント側カーソルが最善の選択になり得るアプリケーションもあり、その場合パフォーマンスは問題になりません。
クライアント側カーソルの明らかな利点の 1 つは、応答が速いことです。結果セットがクライアント コンピュータにダウンロードされた後の、行間を移動しながらの参照は非常に高速です。クライアント側カーソルを使用すると、カーソルに必要なリソースがサーバー上ではなく個々のクライアント上に確保されるため、アプリケーションのスケーラビリティが向上するのが普通です。
サーバー側カーソル
ADO では、adUseServer CursorLocationEnum を使用してサーバー側カーソルを呼び出します。サーバー側カーソルを使用すると、サーバーは、サーバー コンピュータが用意したリソースを使用して結果セットを管理します。サーバー側カーソルは、要求されたデータのみをネットワーク経由で返します。特に過度のネットワーク トラフィックが問題となっている状況では、クライアント側カーソルよりもこのタイプのカーソルの方がパフォーマンスが良くなる場合があります。
ただし、サーバー側カーソルを使う場合、少なくとも一時的には、アクティブなクライアントすべてに対して貴重なサーバーのリソースを消費することになるという点には注意が必要です。したがって、アクティブなクライアントから要求されるすべてのサーバー側カーソルを管理できるだけのサーバー ハードウェアを確保する計画が必要になります。また、サーバー側カーソルでは単一行アクセスしか提供しない、つまりバッチ カーソルを利用できないため、処理速度が低下する可能性があります。
サーバー側カーソルはレコードの挿入、更新、または削除には便利です。サーバー側カーソルを使うと、1 つの接続上で複数のアクティブ ステートメントを実行できます。
プロファイル (個人情報) の管理 |お問い合わせ先 |MSDN Flash ニュースレター
c2007 Microsoft Corporation. All rights reserved. 使用条件 |商標 |プライバシー |日本での個人情報の取り扱い
Microsoft Cursor Service for OLE DB
クライアント側カーソルを選択、つまり、ClientLocation プロパティを adUseClient に設定すると、Microsoft Cursor Service for OLE DB が呼び出されます。ADO のコンテキストでは、"Client Cursor Engine" という言葉も本質的に同じものを指します。このサービスは、データ プロバイダのカーソル サポート機能を補完します。その結果、ユーザーは、すべてのデータ プロバイダで一貫した機能性を得ることができます。
Cursor Service for OLE DB は、ダイナミック プロパティを使用可能にし、特定のメソッドの動作を拡張します。たとえば、Optimize ダイナミック プロパティを使用すると一時インデックスの作成が可能になり、Find メソッドなど特定の操作の機能が向上します。
Cursor Service を使用すると、あらゆる場合のバッチ更新が可能になります。また、静的カーソルのような低機能のカーソルのみを提供するデータ プロバイダでも、動的カーソルのような、より機能的なカーソルの種類を利用できます。
CacheSize の使用
CacheSize プロパティは、プロバイダからローカル メモリに一度に取り込むレコード数を制御するために使用します。たとえば、CacheSize が 10 の場合、初めて Recordset オブジェクトを開いたときに、最初の 10 個のレコードがプロバイダからローカル メモリに取り込まれます。Recordset オブジェクト内を移動するのに応じて、プロバイダはローカル メモリ バッファからデータを返します。キャッシュ内の最後のレコードを通過すると、プロバイダは次の 10 個のレコードをデータ ソースからキャッシュに取り込みます。
注意 CacheSize は、Recordset オブジェクトの Properties コレクションにある、プロバイダ固有のプロパティ Maximum Open Rows に基づいています。CacheSize を Maximum Open Rows より大きい値に設定することはできません。プロバイダで開くことのできる行数を変更するには、Maximum Open Rows を設定します。
CacheSize プロパティの値は Recordset オブジェクトが開いている間に変更できますが、変更後の値は、それ以降にデータ ソースからキャッシュへ取り込むレコード数に対してのみ適用されます。プロパティ値を変更しただけでは、現在のキャッシュの内容は変更されません。
取り込めるレコード数が CacheSize の指定値より少なくても、プロバイダは残りのレコードを返し、エラーにはなりません。
CacheSize プロパティは 0 には設定できません。エラーになります。
ほかのユーザーがソース データを同時に変更しても、キャッシュから取り込まれたレコードには反映されません。キャッシュに格納されているすべてのデータを強制的に更新するには、Resync メソッドを使用します。
CacheSize を 1 より大きい値に設定している場合、レコードを取得した後に削除を行うと、移動メソッド (Move、MoveFirst、MoveLast、MoveNext、および MovePrevious) によって削除済みのレコードに移動する可能性があります。最初のフェッチ後の削除は、削除された行からデータ値にアクセスするまで、データ キャッシュには反映されません。ただし、CacheSize を 1 に設定すると、削除された行はフェッチできないため、この問題は解消します。
カーソルとロックの特性カーソルの特性
カーソルとロックの特性カーソルの特性はプロバイダの機能に左右されますが、さまざまな種類のカーソルおよびロックには、一般に次のような長所と短所があります。
カーソルの種類またはロックの種類 長所 短所 adOpenForwardOnly
- 必要リソースが少ない。
- 後方スクロールができない。
- データの同時操作性がない。
adOpenStatic
- スクロールが可能。
- データの同時操作性がない。
adOpenKeyset
- データの同時操作性がいくらかある。
- スクロールが可能。
- 必要リソースが多い。
- 切断状態では使用できない。
adOpenDynamic
- データの同時操作性が高い。
- スクロールが可能。
- 必要リソースが非常に多い。
- 切断状態では使用できない。
adLockReadOnly
- 必要リソースが少ない。
- スケーラビリティが高い。
- カーソル経由でデータを更新できない。
adLockBatchOptimistic
- バッチ更新可能。
- 切断状態で使用できる。
- ほかのユーザーがデータにアクセスできる。
- 複数ユーザーが同時にデータを変更する可能性がある。
adLockPessimistic
- ロック中はほかのユーザーがデータを変更できない。
- ロック中はほかのユーザーがデータにアクセスできない。
adLockOptimistic
- ほかのユーザーがデータにアクセスできる。
- 複数ユーザーが同時にデータを変更する可能性がある。