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