IMultipleResults を使用して SQL Server Native Client で複数の結果セットを処理する
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
コンシューマーは、 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 によって接続ごとに管理されます。 他の接続が作成されている場合でも、個別の接続のコマンドはロックを共有しません。 コマンドによって要求された行にロックを設定することで、そのコマンドが別のコマンドによってブロックされないようにする必要があります。 MARS を有効にしている場合、その接続では複数のコマンドをアクティブにできます。明示的なトランザクションを使用している場合、すべてのコマンドが共通のトランザクションを共有します。
コマンドを取り消すには、ISSAbort::Abort を使用するか、コマンド オブジェクトおよび派生行セットのすべての参照を解放します。
すべてのインスタンスで IMultipleResults を使用すると、コマンド実行の結果生成されたすべての行セットをコンシューマーが取得し、コマンド実行を取り消して他のコマンドのためにセッションを解放するタイミングを適切に判断できます。
Note
SQL Server カーソルを使用するときは、コマンドを実行するとカーソルが作成されます。 カーソルを作成するときに SQL Server は成功か失敗を返します。したがって、SQL Server インスタンスへのラウンド トリップが完了するのはコマンドを実行した結果が返ってきたときです。 その後、GetNextRows 呼び出しはそれぞれがラウンド トリップになります。 このようなしくみによって、サーバー カーソルからのフェッチの結果である行セットを処理する、複数のアクティブなコマンド オブジェクトが存在できます。 詳細については、「行セットと SQL Server カーソル」を参照してください。