コンシューマーは 、IMultipleResults インターフェイスを使用して、SQL Server Native Client OLE DB プロバイダーのコマンド実行によって返される結果を処理します。 SQL Server Native Client OLE DB プロバイダーが実行コマンドを送信すると、SQL Server によってステートメントが実行され、結果が返されます。
クライアントは、コマンドの実行からのすべての結果を処理する必要があります。 SQL Server Native Client OLE DB プロバイダーのコマンド実行では、結果として複数行セット オブジェクトを生成できるため、 IMultipleResults インターフェイスを使用して、アプリケーション データの取得がクライアントによって開始されるラウンド トリップを確実に完了します。
次の Transact-SQL ステートメントでは、複数の行セットが生成されます。一部には OrderDetails テーブルの行データが含まれており、一部には COMPUTE BY 句の結果が含まれています。
SELECT OrderID, FullPrice = (UnitPrice * Quantity), Discount,
Discounted = UnitPrice * (1 - Discount) * Quantity
FROM OrderDetails
ORDER BY OrderID
COMPUTE
SUM(UnitPrice * Quantity), SUM(UnitPrice * (1 - Discount) * Quantity)
BY OrderID
コンシューマーがこのテキストを含むコマンドを実行し、返された結果インターフェイスとして行セットを要求した場合、最初の行セットのみが返されます。 コンシューマーは、返された行セット内のすべての行を処理できます。 ただし、DBPROP_MULTIPLECONNECTIONS データ ソース プロパティが VARIANT_FALSE に設定されていて、接続で MARS が有効になっていない場合、コマンドが取り消されるまで、セッション オブジェクトで他のコマンドを実行することはできません (SQL Server Native Client OLE DB プロバイダーは別の接続を作成しません)。 接続で MARS が有効になっていない場合、SQL Server Native Client OLE DB プロバイダーは、DBPROP_MULTIPLECONNECTIONSがVARIANT_FALSEされている場合はDB_E_OBJECTOPEN エラーを返し、アクティブなトランザクションがある場合はE_FAILを返します。
また、SQL Server Native Client OLE DB プロバイダーは、ストリーム出力パラメーターを使用する場合にもDB_E_OBJECTOPENを返し、アプリケーションは IMultipleResults::GetResults を呼び出して次の結果セットを取得する前に、返された出力パラメーター値をすべて消費していません。 MARS が有効でなく、接続がビジー状態の場合、行セットを生成しない、またはサーバー カーソルではない行セットを生成するコマンドを実行し、DBPROP_MULTIPLECONNECTIONS データ ソース プロパティが VARIANT_TRUE に設定されている場合、SQL Server Native Client OLE DB プロバイダーは、同時実行コマンド オブジェクトをサポートするための追加の接続を作成します。 トランザクションがアクティブでない場合は、エラーが返されます。 トランザクションとロックは、接続ごとに SQL Server によって管理されます。 2 つ目の接続が生成された場合、別の接続のコマンドはロックを共有しません。 もう一方のコマンドによって要求された行に対するロックを保持して、1 つのコマンドが別のコマンドをブロックしないように注意する必要があります。 MARS が有効になっている場合、接続で複数のコマンドをアクティブにすることができ、明示的なトランザクションが使用されている場合、コマンドはすべて共通のトランザクションを共有します。
コンシューマーは、 ISSAbort::Abort を使用するか、コマンド オブジェクトと派生行セットに保持されているすべての参照を解放することによって、コマンドを取り消すことができます。
すべてのインスタンスで IMultipleResults を 使用すると、コンシューマーはコマンド実行によって生成されたすべての行セットを取得でき、コンシューマーはコマンドの実行を取り消すタイミングを適切に判断し、セッション オブジェクトを他のコマンドで使用できるように解放することができます。
注
SQL Server カーソルを使用すると、コマンド実行によってカーソルが作成されます。 SQL Server は、カーソルの作成時に成功または失敗を返します。そのため、SQL Server のインスタンスへのラウンド トリップは、コマンドの実行からの復帰時に完了します。 各 GetNextRows 呼び出しはラウンド トリップになります。 この方法では、複数のアクティブなコマンド オブジェクトを存在させることができます。各オブジェクトは、サーバー カーソルからのフェッチの結果である行セットを処理します。 詳細については、「 行セットと SQL Server カーソル」を参照してください。