カーソルの種類
Microsoft SQL Server 2005 Compact Edition (SQL Server Compact Edition) のカーソルは、SQL Server で使用するカーソルと似ています。このセクションでは、両者の相違点について説明します。データベース カーソルの詳しい説明については、SQL Server Books Online を参照してください。
SQL Server Compact Edition で使用できるカーソルの種類は、以下のとおりです。
- ベース テーブル
- 静的
- 前方参照のみ
- 前方参照のみ/読み取り専用
- キーセット ドリブン
ベース テーブルのカーソル
ベース テーブルのカーソルは、利用可能な最も低レベルのカーソルです。これらのカーソルはストレージ エンジンに直接機能し、サポートされるカーソルの種類の中で最も高速に動作します。最小のコストで前方または後方にスクロールでき、更新も可能です。
あるインデックスでカーソルを直接開くこともできます。テーブルの行を順序付けすること、特定値のシークを有効にすること、およびインデックスの値の範囲に基づいて行を制限することがインデックスでサポートされています。
ベース テーブルのカーソルのメンバシップは、動的です。同じテーブル上で開かれている 2 つのカーソルは、いずれも同一のトランザクション スコープにあるとすると、データの挿入、削除、および変更を即時に検知します。ベース テーブルのカーソルは更新できるので、クライアントがこのカーソルを使用して、基になるデータを変更できます。
ベース テーブルのカーソルでは、クエリの結果を確認できません。SELECT * FROM tablename
などのクエリの結果は、ベース テーブルのカーソルからは返されません。サポートされているクエリ結果カーソルの 1 つが代わりに使用されます。
ADO .NET を使用して、ベース テーブルのカーソルを取得する方法の例を以下に示します。
//Base Table Cursor
cmd.CommandText = "tablename";
cmd.CommandType = CommandType.TableDirect;
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable);
ADO .NET を使用して、インデックス カーソルを取得する方法の例を以下に示します。
cmd.CommandText = "tablename";
cmd.IndexName = "indexname";
cmd.CommandType = CommandType.TableDirect;
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable);
静的カーソル
静的カーソルは、SQL Server Compact Edition の以前のバージョンではスクロール可能なクエリ カーソルと呼ばれていました。このカーソルは、結果セットの完全なコピーを作成および格納します。ただし、ユーザーが明示的に要求したときに取得される long 型の値のデータは例外です。そのような結果セットは、必要なときだけ格納されます。この点が、カーソルの作成時に結果セットに値が格納される SQL Server とは異なります。静的カーソルは後方と前方へのスクロールをサポートしていますが、更新はサポートしていません。状態非依存のデータについては、外部での変更が検知されません。クエリ結果は、カーソルの有効期間の間キャッシュされます。静的カーソルは前方参照のみのカーソルよりも多機能ですが、低速である上、多くのメモリを消費します。スクロールが必要で、キーセット カーソルが適さない場合に限り、静的カーソルを検討することをお勧めします。
ADO.NET を使用して静的カーソルを取得する方法の例を以下に示します。
cmd.CommandText = "Select * from tablename";
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Insensitive);
前方参照のみのカーソル
前方参照のみのカーソルは、更新を実行できる最も高速なカーソルですが、スクロールをサポートしていません。サポートされているのは、カーソルの先頭から末尾に向けて連続的に行をフェッチすることだけです。フェッチされない限り、行はデータベースから取得されません。現在のユーザーが実行したか、他のユーザーがコミットして結果セットの行に影響を及ぼすすべての INSERT ステートメント、UPDATE ステートメント、および DELETE ステートメントは、行をカーソルからフェッチしたときに影響が反映されます。カーソルを後方にスクロールすることができないので、行をフェッチした後でデータベースの行に加えた変更は、カーソルを使用しても参照できません。
前方参照のみのカーソルと前方参照のみ/読み取り専用のカーソルは、クエリ ベースのカーソルとしては最も高速です。この 2 種類のカーソルは、速度とメモリの使用状況を最も重要視する場合に適しています。
ADO .NET を使用して、前方参照のみのカーソルを取得する方法の例を以下に示します。
cmd.CommandText = "Select * from tablename";
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Updatable);
前方参照のみ/読み取り専用のカーソル
前方参照のみ/読み取り専用のカーソルは、SQL Server Compact Edition の以前のバージョンでは前方参照のみのカーソルと呼ばれていました。このカーソルは最も高速ですが、更新を実行できません。
ADO.NET を使用して前方参照のみ/読み取り専用のカーソルを取得する方法の例を以下に示します。
cmd.CommandText = "Select * from tablename";
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.None);
注 内部的には SQL Server Compact Edition のカーソルはすべて更新可能なので、読み取り専用の列のみを返すクエリに読み取り専用のカーソルを作成することはできません。SQL Server Compact Edition では、SqlCeResultSet に返された読み取り専用の列を更新することはできません。したがって、"更新可能な列がないので、クエリには更新可能なカーソルを生成できません。" というエラーが発生します。
キーセット ドリブン カーソル
SQL Server Compact Edition のキーセット ドリブン カーソルは、更新およびスクロールが可能です。キーセット ドリブン カーソルは、キーセットと呼ばれる物理的な ID のセットにより制御されます。キーセットは、カーソルが開かれた時点で SELECT ステートメントにより絞り込まれているすべての行から構成されます。カーソルが開かれるとき、一時的なテーブルにキーセットが作成されます。キーセット ドリブン カーソルのメンバシップは、クエリを実行する時点で決定します。
キーセット ドリブン カーソルは、SQL Server Compact Edition と SQL Server でわずかに異なります。SQL Server のキーセット ドリブン カーソルは、キーセットのキーとして一意の ID のセットを使用します。SQL Server Compact Edition では、キーはテーブルに値を論理的に格納するブックマークです。このキーは一意の ID ではありません。
キーセット ドリブン カーソルは、わずかな変更も感知しますが、他のカーソルほど厳密には感知しません。たとえば、カーソルの中の挿入は最後に表示されますが、カーソルの外の挿入は表示されません。このような場合、カーソルをいったん閉じて開き直すか、前方参照のみのカーソルの 1 つを使用することをお勧めします。
SQL Server Compact Edition ではブックマークを使用してキーセットを定義するので、カーソルを使用することで、キーセットに含まれる行のデータ値に対するすべての変更が表示されます。これはカーソルの中と外で行われる変更のいずれにも該当します。
キーセット カーソルの中か外かにかかわらず削除を行った場合、行をフェッチしようすると、行が削除されていると報告されます。
ADO .NET を使用して、キーセット ドリブン カーソルを取得する方法の例を以下に示します。
cmd.CommandText = "Select * from tablename";
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable);
結合の操作
キーセット ドリブン カーソルを開くためのクエリに結合列が含まれる場合、列は更新できません。ユーザーは結合列に新しい値を挿入できますが、更新はサポートされません。
キーセットを使用して DataGrid オブジェクトなどのユーザーが更新できるコントロールを設定する場合、コントロールの値をユーザーが更新しようとすると失敗します。結合した列のデータを DataGrid で表示するアプリケーションを開発する場合、DataGrid の結合列を読み取り専用に設定します。
参照
概念
カーソル (SQL Server Compact Edition)
カーソルの種類の選択
カーソルとロック
暗黙的なカーソルの変換
キーセット ドリブン カーソルの更新