IMultipleResults を使用した複数の結果セットの処理
コンシューマは 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 プロバイダによって他の接続が作成されることはありません)。SQL Server Native Client OLE DB プロバイダは接続で MARS が有効でないとき、DBPROP_MULTIPLECONNECTIONS が VARIANT_FALSE の場合は DB_E_OBJECTOPEN エラーを返し、アクティブなトランザクションがある場合は E_FAIL を返します。
また、ストリーム出力パラメータを使用していて、アプリケーションが返された出力パラメータの値を使い残した状態で IMultipleResults::GetResults を呼び出して次の結果セットを取得しようとすると、SQL Server Native Client OLE DB プロバイダから DB_E_OBJECTOPEN が返されます。MARS が無効になっており、行セットを生成しないコマンドやサーバー カーソルでない行セットを生成するコマンドを実行していて接続がビジー状態であり、また DBPROP_MULTIPLECONNECTIONS データ ソース プロパティが VARIANT_TRUE に設定されている場合、SQL Server Native Client OLE DB プロバイダでは、トランザクションがアクティブの場合を除き、同時実行されるコマンド オブジェクトをサポートする接続が追加作成されます (トランザクションがアクティブの場合はエラーが返されます)。トランザクションとロックは、SQL Server によって接続ごとに管理されます。他の接続が作成されている場合でも、個別の接続のコマンドはロックを共有しません。コマンドによって要求された行にロックを設定することで、そのコマンドが別のコマンドによってブロックされないようにする必要があります。MARS を有効にしている場合、その接続では複数のコマンドをアクティブにできます。明示的なトランザクションを使用している場合、すべてのコマンドが共通のトランザクションを共有します。
コマンドをキャンセルするには、ISSAbort::Abort を使用するか、コマンド オブジェクトおよび派生行セットのすべての参照を解放します。
すべてのインスタンスで IMultipleResults を使用すると、コマンド実行の結果生成されたすべての行セットをコンシューマが取得し、コマンド実行をキャンセルして他のコマンドのためにセッションを解放するタイミングを適切に判断できます。
注 |
---|
SQL Server カーソルを使用するときは、コマンドを実行するとカーソルが作成されます。カーソルを作成するときに SQL Server は成功か失敗を返します。したがって、SQL Server インスタンスへのラウンド トリップが完了するのはコマンドを実行した結果が返ってきたときです。その後、GetNextRows 呼び出しはそれぞれがラウンド トリップになります。このようなしくみによって、サーバー カーソルからのフェッチの結果である行セットを処理する、複数のアクティブなコマンド オブジェクトが存在できます。詳細については、「行セットと SQL Server カーソル」を参照してください。 |