IRowset インターフェイスは、基本行セット インターフェイスです。 IRowset インターフェイスには、行を順番にフェッチし、それらの行からデータを取得し、行を管理するためのメソッドが用意されています。 コンシューマーは、すべての基本的な行セット操作に IRowset のメソッドを使用します。 これには、行のフェッチと解放、列値の取得が含まれます。
コンシューマーが行セットのインターフェイス ポインターを取得する場合、最初の手順は通常、 IRowsetInfo::GetProperties メソッドを使用して行セットの機能を決定することです。 これにより、行セットによって公開されるインターフェイスに関する情報と、アクティブな行の最大数や同時に保留中の更新を行うことができる行の数など、個別のインターフェイスとして表示されない行セットの機能も返されます。
コンシューマーの次の手順は、行セット内の列の特性 (メタデータ) を決定することです。 このためには、単純な列情報には IColumnsInfo メソッドを使用し、拡張列情報には IColumnsRowset メソッドを使用します。 GetColumnInfo メソッドは、次の情報を返します。
結果セット内の列の数。
DBCOLUMNINFO 構造体の配列 。列ごとに 1 つ。
構造体の順序は、行セットに列が表示される順序です。 各 DBCOLUMNINFO 構造体には、列名、列の序数、列内の値の最大長、列のデータ型、有効桁数、長さなどの列メタデータが含まれます。
1 つの割り当てブロック内のすべての文字列値のストレージへのポインター。
コンシューマーは、メタデータから、または行セットを生成したテキスト コマンドに基づいて、必要な列を決定します。 IColumnsInfo によって返される列情報の順序、または IColumnsRowset によって返される列メタデータ行セットの序数から、必要な列の序数が決定されます。
IColumnsInfo インターフェイスと IColumnsRowset インターフェイスは、行セット内の列に関する情報を抽出するために使用されます。 IColumnsInfo インターフェイスは限られた情報セットを返しますが、IColumnsRowset はすべてのメタデータを提供します。
注
SQL Server バージョン 7.0 以前では、 IColumnsInfo::GetColumnsInfo によって返DBCOLUMN_COMPUTEMODE省略可能なメタデータ列は、基になる列が計算されるかどうかを判断できないため、(列が計算されるかどうかを示す値ではなく) DBSTATUS_S_ISNULLを返します。
序数は、列へのバインドを指定するために使用されます。 バインディングは、コンシューマーの構造体の要素を列に関連付ける構造体です。 バインドでは、列のデータ値、長さ、および状態値をバインドできます。
一連のバインディングがアクセサーにまとめて収集されます。 これは、 IAccessor::CreateAccessor メソッドを使用して作成されます。 アクセサーには複数のバインドを含めることができるため、複数の列のデータを 1 回の呼び出しで取得または設定できます。 コンシューマーは、アプリケーションのさまざまな部分で異なる使用パターンに一致する複数のアクセサーを作成できます。 行セットが存在したままアクセサーを作成および解放できます。
データベースから行をフェッチするために、コンシューマーは IRowset::GetNextRows や IRowsetLocate::GetRowsAt などのメソッドを呼び出します。 これらのフェッチ操作により、サーバーからプロバイダーの行バッファーに行データが格納されます。 コンシューマーは、プロバイダーの行バッファーに直接アクセスできません。 コンシューマーは IRowset::GetData を使用してプロバイダーのバッファーからコンシューマー バッファーにデータをコピーし、 IRowsetChange::SetData を使用してコンシューマー バッファーからプロバイダー バッファーにデータ変更をコピーします。
コンシューマーは GetData メソッドを呼び出し、そのハンドルを行、アクセサーへのハンドル、およびコンシューマー割り当てバッファーへのポインターを渡します。 GetData はデータを変換し、アクセサーの作成に使用されるバインディングで指定された列を返します。 コンシューマーは、異なるアクセサーとバッファーを使用して 1 行に対して 複数の GetData を 呼び出すことができるため、コンシューマーは同じデータの複数のコピーを取得できます。
可変長列のデータは、いくつかの方法で処理できます。 まず、このような列は、コンシューマーの構造の有限セクションにバインドできます。 これにより、データの長さがバッファーの長さを超えると切り捨てられます。 コンシューマーは、状態DBSTATUS_S_TRUNCATEDを確認することで、切り捨てが発生したことを確認できます。 返される長さは常に実際の長さ (バイト単位) であるため、コンシューマーは切り捨てられたデータの量を判断することもできます。
コンシューマーは、行のフェッチまたは更新を完了すると、 ReleaseRows メソッドを使用して行を解放します。 これにより、行セット内の行のコピーからリソースが解放され、新しい行用のスペースが作成されます。 その後、コンシューマーは、行をフェッチまたは作成し、その中のデータにアクセスするというサイクルを繰り返すことができます。
コンシューマーは、行セットを使用して終了すると、 IAccessor::ReleaseAccessor メソッドを呼び出してアクセサーを解放します。 行セットによって公開されているすべてのインターフェイスで IUnknown::Release メソッドを呼び出して、行セットを解放します。 行セットが解放されると、コンシューマーが保持する可能性がある残りの行またはアクセサーが強制的に解放されます。