SQL Server の既定の結果セットの使用
ODBC カーソルの既定の属性を次に示します。
SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_TYPE, SQL_CURSOR_FORWARD_ONLY, SQL_IS_INTEGER);
SQLSetStmtAttr(hstmt, SQL_ATTR_CONCURRENCY, SQL_CONCUR_READ_ONLY, SQL_IS_INTEGER);
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, 1, SQL_IS_INTEGER);
これらの属性が既定値に設定されているときは必ず、SQL Native Client ODBC ドライバで SQL Server の既定の結果セットが使用されます。既定の結果セットは、SQL Server でサポートされるすべての SQL ステートメントに使用でき、結果セット全体をクライアントに転送する際の最も効率的な方法です。
SQL Server 2005 では、複数のアクティブな結果セット (MARS) がサポートされるようになりました。つまり、アプリケーションでは接続ごとに複数のアクティブな既定の結果セットを受け取れるようになりました。MARS は既定では有効になっていません。
SQL Server 2005 より前のリリースでは、既定の結果セットは 1 つの接続における複数のアクティブなステートメントをサポートしません。SQL ステートメントが 1 つの接続で実行された後、サーバーは結果セットのすべての行が処理されるまで、その接続に対するクライアントからのコマンドを受け付けません (結果セットの残りの行の処理をキャンセルする要求は除きます)。部分的に処理された結果セットの残りの部分をキャンセルするには、fOption パラメータに SQL_CLOSE を設定して SQLCloseCursor または SQLFreeStmt を呼び出します。部分的に処理された結果セットを終了し、別の結果セットが存在するかどうかをテストするには、SQLMoreResults を呼び出します。既定の結果セットが完全に処理される前に ODBC アプリケーションからその接続ハンドルでコマンドが実行されると、その呼び出しで SQL_ERROR が発生し、SQLGetDiagRec の呼び出しで次のメッセージが返されます。
szSqlState: "HY000", pfNativeError: 0
szErrorMsg: "[Microsoft][SQL Native Client]
Connection is busy with results for another hstmt."