カーソルの行セット サイズ

ODBC カーソルでは、一度にフェッチできる行数は制限されません。1 回の SQLFetch または SQLFetchScroll の呼び出しで複数行を取得できます。Microsoft SQL Server のようなクライアント/サーバー型のデータベースで作業しているときは、1 回に複数行を取得する方が効率的です。1 回のフェッチで返される行数を行セット サイズと呼びます。行セット サイズは、SQLSetStmtAttr の SQL_ATTR_ROW_ARRAY_SIZE を使用して指定します。

SQLUINTEGER uwRowsize;
SQLSetStmtAttr(m_hstmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)uwRowsetSize, SQL_IS_UINTEGER);

行セット サイズが 2 以上のカーソルをブロック カーソルと呼びます。

ブロック カーソルの結果セット列は、次の 2 つの方法でバインドできます。

  • 列方向のバインド

    各列が変数の配列にバインドされます。各配列には行セット サイズと同じ数の要素が含まれます。

  • 行方向のバインド

    1 行のすべての列のデータとインジケータが含まれる構造体を使用して配列が構築されます。この配列には行セット サイズと同じ数の構造体が含まれます。

列方向のバインドか行方向のバインドのいずれかを使用すると、SQLFetch または SQLFetchScroll を呼び出すたびに、バインドされた配列に、取得した行セットのデータが格納されます。

また、SQLGetData を使用して、ブロック カーソルから列データを取得することもできます。SQLGetData が 1 回に処理する行は 1 行なので、SQLGetData を呼び出す前に SQLSetPos を呼び出して、行セット内の特定の行を現在行に設定する必要があります。

SQL Server Native Client ODBC ドライバには、結果セット全体をすばやく取得するための、行セットを使用した最適化機能が用意されています。この最適化機能を使用するには、SQLExecDirect または SQLExecute を呼び出すときに、カーソル属性を既定値 (順方向専用、読み取り専用、行セット サイズ = 1) に設定します。これにより、既定の結果セットが設定されます。スクロールを使用しないでクライアントに結果を送信する場合は、既定の結果セットの方がサーバー カーソルよりも効率的です。ステートメントを実行後、行セット サイズを増やし、列方向のバインドか行方向のバインドを使用します。これにより、SQL Server Native Client ODBC ドライバがクライアントのネットワーク バッファから連続的に行を取得しながら、SQL Server が既定の結果セットを使用して効率的にクライアントに結果行を送信できるようになります。

関連項目

概念