複数のアクティブな結果セット (MARS) の使用Using Multiple Active Result Sets (MARS)

[!INCLUDE[ssVersion2005](../../../includes/ssversion2005-md.md)] では、[!INCLUDE[ssDE](../../../includes/ssde-md.md)] にアクセスするアプリケーションで複数のアクティブな結果セット (MARS) がサポートされるようになりました。[!INCLUDE[ssVersion2005](../../../includes/ssversion2005-md.md)] introduced support for multiple active result sets (MARS) in applications accessing the [!INCLUDE[ssDE](../../../includes/ssde-md.md)]. 以前のバージョンの [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] では、データベース アプリケーションは 1 つの接続で複数のアクティブなステートメントを保持できませんでした。In earlier versions of [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)], database applications could not maintain multiple active statements on a connection. [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] の既定の結果セットを使用しているときは、アプリケーションはその接続で他のバッチを実行する前に、1 つのバッチのすべての結果セットを処理するか、取り消す必要がありました。When using [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] default result sets, the application had to process or cancel all result sets from one batch before it could execute any other batch on that connection. [!INCLUDE[ssVersion2005](../../../includes/ssversion2005-md.md)] では新しい接続属性が導入され、アプリケーションは接続ごとに複数の要求を保留中にできるだけでなく、接続ごとに複数のアクティブな既定の結果セットを保持できるようになりました。[!INCLUDE[ssVersion2005](../../../includes/ssversion2005-md.md)] introduced a new connection attribute that allows applications to have more than one pending request per connection, and in particular, to have more than one active default result set per connection. MARS によって、次の新しい機能を使用したアプリケーションのデザインが簡素化されます。MARS simplifies application design with the following new capabilities: - アプリケーションは、既定の結果セットを複数開くことができ、複数の既定の結果セットからの読み取りをインターリーブすることができます。Applications can have multiple default result sets open and can interleave reading from them. - アプリケーションは既定の結果セットを開いたまま、他のステートメント (INSERT、UPDATE、DELETE、ストアド プロシージャ呼び出しなど) を実行できます。Applications can execute other statements (for example, INSERT, UPDATE, DELETE, and stored procedure calls) while default result sets are open. MARS を使用するアプリケーションについては、次のガイドラインを参照してください。Applications using MARS will find the following guidelines beneficial: - 1 つの SQL ステートメント (SELECT、OUTPUT を伴う DML、RECEIVE、READ TEXT など) で生成される結果セットが短期間しか有効でない場合や結果セットが小さい場合は、既定の結果セットを使用します。Default results sets should be used for short lived or short result sets generated by single SQL statements (SELECT, DML with OUTPUT, RECEIVE, READ TEXT, and so on). - 1 つの SQL ステートメントで生成される結果セットが長期間有効な場合や結果セットが大きくなる場合は、サーバー カーソルを使用します。Server cursors should be used for longer lived or large result sets generated by single SQL statements. - 結果を返すかどうかにかかわらず手続き型の要求の場合、および複数の結果を返すバッチの場合、常に、結果の最後まで読み取ります。Always read to the end of results for procedural requests regardless of whether they return results or not, and for batches that return multiple results. - 接続プロパティの変更やトランザクションの管理には、できるだけ [!INCLUDE[tsql](../../../includes/tsql-md.md)] ステートメントではなく API 呼び出しを優先して使用します。Wherever possible, use API calls to change connection properties and manage transactions in preference to [!INCLUDE[tsql](../../../includes/tsql-md.md)] statements. - MARS では、複数のバッチが同時に実行されている間、セッション スコープの権限の借用が禁止されます。In MARS, session-scoped impersonation is prohibited while concurrent batches are running. > [!NOTE] > 既定では、MARS 機能は有効になっていません。By default, MARS functionality is not enabled. [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] Native Client で [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] に接続するときに MARS を使用するには、接続文字列で MARS を明示的に有効にする必要があります。To use MARS when connecting to [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] with [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] Native Client, you must specifically enable it within a connection string. 詳細については、この後の「[!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] Native Client OLE DB プロバイダー」と「[!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] Native Client ODBC ドライバー」を参照してください。For more information, see the [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] Native Client OLE DB provider and [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] Native Client ODBC driver sections, later in this topic. [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] Native Client では、接続でのアクティブなステートメントの数は制限されません。[!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] Native Client does not limit the number of active statements on a connection. 複数のステートメントで構成される単一のバッチやストアド プロシージャを複数同時実行する必要のない一般的なアプリケーションでは、MARS の実装方法を理解しなくても、MARS の利点を得ることができます。Typical applications which do not need to have more than a single multistatement batch or stored procedure executing at the same time will benefit from MARS without having to understand how MARS is implemented. ただし、より複雑な要件のアプリケーションでは、MARS の実装方法を考慮する必要があります。However, applications with more complex requirements do need to take account of this. MARS では、1 つの接続内で複数の要求の実行をインターリーブできます。MARS enables the interleaved execution of multiple requests within a single connection. つまり、1 つのバッチを実行し、その実行内で他の要求を実行できます。That is, it allows a batch to run, and within its execution, it allows other requests to execute. ただし、MARS では並列実行が行われるのではなく、複数の実行がインターリーブされることに注意してください。Note, however, that MARS is defined in terms of interleaving, not in terms of parallel execution. MARS のインフラストラクチャでは、複数のバッチがインターリーブ方式で実行されますが、実行の切り替えは明確に定義された時点でしか行われません。The MARS infrastructure allows multiple batches to execute in an interleaved fashion, though execution can only be switched at well defined points. また、ほとんどのステートメントはバッチ内で自動的に実行される必要があります。In addition, most statements must run atomically within a batch. クライアントに行を返すステートメント ( *yield ポイント*と呼ばれることもあります) は、次の例のように、行がクライアントに送信されている間、完了前に実行をインターリーブすることができます。Statements which return rows to the client, which are sometimes referred to as *yield points*, are allowed to interleave execution before completion while rows are being sent to the client, for example: - SELECTSELECT - FETCHFETCH - RECEIVERECEIVE ストアド プロシージャまたはバッチの一部として実行されるその他のステートメントはいずれも、他の MARS 要求に切り替えられる前に実行を完了する必要があります。Any other statements that are executed as part of a stored procedure or batch must run to completion before execution can be switched to other MARS requests. バッチがどのようにインターリーブ実行されるかは、さまざまな要因の影響を受けます。そのため、呼び出しポイントを含む複数のバッチからのコマンドが実行されるときに、正確なシーケンスを予測することは困難です。The exact manner in which batches interleave execution is influenced by a number of factors, and it is difficult to predict the exact sequence in which commands from multiple batches that contain yield points will be executed. このような複雑なバッチをインターリーブ実行したときに、好ましくない影響が発生しないように注意してください。Be careful to avoid unwanted side effects due to interleaved execution of such complex batches. このような問題を回避するために、接続状態 (SET、USE) やトランザクション (BEGIN TRAN、COMMIT、ROLLBACK) を管理する場合は、[!INCLUDE[tsql](../../../includes/tsql-md.md)] ステートメントではなく API 呼び出しを使用します。このとき、複数のステートメントで構成されるバッチに呼び出しポイントも含まれている場合、接続状態やトランザクションを管理するステートメントを含めないようにします。さらに、このようなバッチでは、すべての結果を処理するか、残りを取り消すことによって、実行を順番に行います。Avoid problems by using API calls rather than [!INCLUDE[tsql](../../../includes/tsql-md.md)] statements to manage connection state (SET, USE) and transactions (BEGIN TRAN, COMMIT, ROLLBACK) by not including these statements in multi-statement batches that also contain yield points, and by serializing execution of such batches by consuming or canceling all results. > [!NOTE] > MARS が有効なときにトランザクションを手動または暗黙に開始するバッチやストアド プロシージャでは、バッチが終了する前にトランザクションを完了する必要があります。A batch or stored procedure which starts a manual or implicit transaction when MARS is enabled must complete the transaction before the batch exits. トランザクションを完了しないと、[!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] はバッチの終了時にトランザクションによって行われたすべての変更をロールバックします。If it does not, [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] rolls back all changes made by the transaction when the batch finishes. このようなトランザクションは、[!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] によってバッチスコープのトランザクションとして管理されます。Such a transaction is managed by [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] as a batch-scoped transaction. これは [!INCLUDE[ssVersion2005](../../../includes/ssversion2005-md.md)] で導入された新しい形式のトランザクションで、MARS が有効なときに、既存の適切に動作するストアド プロシージャを使用できるようになります。This is a new type of transaction introduced in [!INCLUDE[ssVersion2005](../../../includes/ssversion2005-md.md)] to enable existing well-behaved stored procedures to be used when MARS is enabled. バッチスコープのトランザクションの詳細については、「 [transact-sql)(のトランザクションステートメント](/sql/t-sql/language-elements/transactions-transact-sql)」を参照してください。For more information about batch-scoped transactions, see [Transaction Statements (Transact-SQL)](/sql/t-sql/language-elements/transactions-transact-sql). ADO から MARS を使用する例については、「 [USING ado with SQL Server Native Client](../applications/using-ado-with-sql-server-native-client.md)」を参照してください。For an example of using MARS from ADO, see [Using ADO with SQL Server Native Client](../applications/using-ado-with-sql-server-native-client.md). ## SQL Server Native Client OLE DB プロバイダーSQL Server Native Client OLE DB Provider Native [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] Client OLE DB プロバイダーは、DBPROPSET_SQLSERVERDBINIT プロパティセットに実装されている SSPROP_INIT_MARSCONNECTION データソース初期化プロパティを追加することによって、MARS をサポートしています。The [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] Native Client OLE DB provider supports MARS through the addition of the SSPROP_INIT_MARSCONNECTION data source initialization property, which is implemented in the DBPROPSET_SQLSERVERDBINIT property set. また、新しい接続文字列のキーワードとして `MarsConn` が追加されました。In addition, a new connection string keyword, `MarsConn`, as been added. このキーワードは、`true` または `false` を値として受け取ります。既定値は `false` です。It accepts `true` or `false` values; `false` is the default. データ ソース プロパティ DBPROP_MULTIPLECONNECTIONS の既定値は VARIANT_TRUE です。The data source property DBPROP_MULTIPLECONNECTIONS defaults to VARIANT_TRUE. これは、複数の同時実行コマンドや行セット オブジェクトをサポートするために、プロバイダーが複数の接続を起動することを意味しています。This means the provider will spawn multiple connections in order to support multiple concurrent command and rowset objects. MARS が有効になっ[!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)]ている場合、Native Client は1つの接続で複数のコマンドと行セットオブジェクトをサポートできるため、MULTIPLE_CONNECTIONS は既定で VARIANT_FALSE に設定されます。When MARS is enabled, [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] Native Client can support multiple command and rowset objects on a single connection, so MULTIPLE_CONNECTIONS is set to VARIANT_FALSE by default. DBPROPSET_SQLSERVERDBINIT プロパティセットに対する拡張機能の詳細については、「[初期化プロパティと承認プロパティ](../../native-client-ole-db-data-source-objects/initialization-and-authorization-properties.md)」を参照してください。For more information about enhancements made to the DBPROPSET_SQLSERVERDBINIT property set, see [Initialization and Authorization Properties](../../native-client-ole-db-data-source-objects/initialization-and-authorization-properties.md). ### SQL Server Native Client OLE DB プロバイダーの例SQL Server Native Client OLE DB Provider Example この例では、 [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)]ネイティブ OLE DB プロバイダーを使用してデータソースオブジェクトを作成し、セッションオブジェクトを作成する前に、DBPROPSET_SQLSERVERDBINIT プロパティセットを使用して MARS を有効にします。In this example, a data source object is created using the [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] Native OLE DB provider, and MARS is enabled using the DBPROPSET_SQLSERVERDBINIT property set before the session object is created. ``` #include IDBInitialize *pIDBInitialize = NULL; IDBCreateSession *pIDBCreateSession = NULL; IDBProperties *pIDBProperties = NULL; // Create the data source object. hr = CoCreateInstance(CLSID_SQLNCLI10, NULL, CLSCTX_INPROC_SERVER, IID_IDBInitialize, (void**)&pIDBInitialize); hr = pIDBInitialize->QueryInterface(IID_IDBProperties, (void**)&pIDBProperties); // Set the MARS property. DBPROP rgPropMARS; // The following is necessary since MARS is off by default. rgPropMARS.dwPropertyID = SSPROP_INIT_MARSCONNECTION; rgPropMARS.dwOptions = DBPROPOPTIONS_REQUIRED; rgPropMARS.dwStatus = DBPROPSTATUS_OK; rgPropMARS.colid = DB_NULLID; V_VT(&(rgPropMARS.vValue)) = VT_BOOL; V_BOOL(&(rgPropMARS.vValue)) = VARIANT_TRUE; // Create the structure containing the properties. DBPROPSET PropSet; PropSet.rgProperties = &rgPropMARS; PropSet.cProperties = 1; PropSet.guidPropertySet = DBPROPSET_SQLSERVERDBINIT; // Get an IDBProperties pointer and set the initialization properties. pIDBProperties->SetProperties(1, &PropSet); pIDBProperties->Release(); // Initialize the data source object. hr = pIDBInitialize->Initialize(); //Create a session object from a data source object. IOpenRowset * pIOpenRowset = NULL; hr = IDBInitialize->QueryInterface(IID_IDBCreateSession, (void**)&pIDBCreateSession)); hr = pIDBCreateSession->CreateSession( NULL, // pUnkOuter IID_IOpenRowset, // riid &pIOpenRowset )); // ppSession // Create a rowset with a firehose mode cursor. IRowset *pIRowset = NULL; DBPROP rgRowsetProperties[2]; // To get a firehose mode cursor request a // forward only read only rowset. rgRowsetProperties[0].dwPropertyID = DBPROP_IRowsetLocate; rgRowsetProperties[0].dwOptions = DBPROPOPTIONS_REQUIRED; rgRowsetProperties[0].dwStatus = DBPROPSTATUS_OK; rgRowsetProperties[0].colid = DB_NULLID; VariantInit(&(rgRowsetProperties[0].vValue)); rgRowsetProperties[0].vValue.vt = VARIANT_BOOL; rgRowsetProperties[0].vValue.boolVal = VARIANT_FALSE; rgRowsetProperties[1].dwPropertyID = DBPROP_IRowsetChange; rgRowsetProperties[1].dwOptions = DBPROPOPTIONS_REQUIRED; rgRowsetProperties[1].dwStatus = DBPROPSTATUS_OK; rgRowsetProperties[1].colid = DB_NULLID; VariantInit(&(rgRowsetProperties[1].vValue)); rgRowsetProperties[1].vValue.vt = VARIANT_BOOL; rgRowsetProperties[1].vValue.boolVal = VARIANT_FALSE; DBPROPSET rgRowsetPropSet[1]; rgRowsetPropSet[0].rgProperties = rgRowsetProperties rgRowsetPropSet[0].cProperties = 2 rgRowsetPropSet[0].guidPropertySet = DBPROPSET_ROWSET; hr = pIOpenRowset->OpenRowset (NULL, &TableID, NULL, IID_IRowset, 1, rgRowsetPropSet (IUnknown**)&pIRowset); ``` ## SQL Server Native Client ODBC ドライバーSQL Server Native Client ODBC Driver Native [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] Client ODBC ドライバーでは、 [SQLSetConnectAttr](../../native-client-odbc-api/sqlsetconnectattr.md)および[sqlgetconnectattr](../../native-client-odbc-api/sqlgetconnectattr.md)関数への追加によって MARS がサポートされています。The [!INCLUDE[ssNoVersion](../../../includes/ssnoversion-md.md)] Native Client ODBC driver supports MARS through additions to the [SQLSetConnectAttr](../../native-client-odbc-api/sqlsetconnectattr.md) and [SQLGetConnectAttr](../../native-client-odbc-api/sqlgetconnectattr.md) functions. SQL_COPT_SS_MARS_ENABLED が追加され、SQL_MARS_ENABLED_YES または SQL_MARS_ENABLED_NO を受け取ります。既定値は SQL_MARS_ENABLED_NO です。SQL_COPT_SS_MARS_ENABLED has been added to accept either SQL_MARS_ENABLED_YES or SQL_MARS_ENABLED_NO, with SQL_MARS_ENABLED_NO being the default. また、新しい接続文字列のキーワードとして `Mars_Connection` が追加されました。In addition, a new connection string keyword, `Mars_Connection`, as been added. このキーワードは、"yes" と "no" を値として受け取ります。既定値は "no" です。It accepts "yes" or "no" values; "no" is the default. ### SQL Server Native Client ODBC ドライバーの例SQL Server Native Client ODBC Driver Example この例では、 **SQLSetConnectAttr**関数を使用して、 **SQLDriverConnect**関数を呼び出してデータベースに接続する前に、MARS を有効にします。In this example, the **SQLSetConnectAttr** function is used to enable MARS before calling the **SQLDriverConnect** function to connect the database. 接続が確立されると、2つの**SQLExecDirect**関数が呼び出され、同じ接続に2つの異なる結果セットが作成されます。Once the connection is made, two **SQLExecDirect** functions are called to create two separate result sets on the same connection. ``` #include SQLSetConnectAttr(hdbc, SQL_COPT_SS_MARS_ENABLED, SQL_MARS_ENABLED_YES, SQL_IS_UINTEGER); SQLDriverConnect(hdbc, hwnd, "DRIVER=SQL Server Native Client 10.0; SERVER=(local);trusted_connection=yes;", SQL_NTS, szOutConn, MAX_CONN_OUT, &cbOutConn, SQL_DRIVER_COMPLETE); SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt1); SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt2); // The 2nd execute would have failed with connection busy error if // MARS were not enabled. SQLExecDirect(hstmt1, L"SELECT * FROM Authors", SQL_NTS); SQLExecDirect(hstmt2, L"SELECT * FROM Titles", SQL_NTS); // Result set processing can interleave. SQLFetch(hstmt1); SQLFetch(hstmt2); ``` ## 参照See Also [SQL Server Native Client の機能](sql-server-native-client-features.md) [SQL Server Native Client Features](sql-server-native-client-features.md) [SQL Server の既定の結果セットの使用Using SQL Server Default Result Sets](../../native-client-odbc-cursors/implementation/using-sql-server-default-result-sets.md)