カーソルの種類 (PDO_SQLSRV ドライバー)
PDO_SQLSRV ドライバーを使用すると、複数のカーソルの 1 つでスクロール可能な結果セットを作成できます。
PDO_SQLSRV ドライバーを使用してカーソルを指定する方法と、コードのサンプルについては、「pdo::prepare」を参照してください。
PDO_SQLSRV とサーバー側のカーソル
バージョン 3.0 より前の Microsoft SQL Server 用 Drivers for PHP では、PDO_SQLSRV ドライバーを使用して、サーバー側の順方向専用または静的カーソルで結果セットを作成することができました。 バージョン 3.0 の Microsoft SQL Server 用 Drivers for PHP からは、キーセットと動的カーソルも利用できます。
サーバー側のカーソルの種類は、PDO::prepare を使用して次のいずれかのカーソルの種類を選択することで指定できます。
PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY
PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL
PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL
を指定し、その後適切な値を PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE
に渡すことで、動的、静的、またはキーセット カーソルを要求できます。 サーバー側のカーソル用に PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE
に渡すことができる値は、次のとおりです。
PDO::SQLSRV_CURSOR_DYNAMIC
PDO::SQLSRV_CURSOR_STATIC
PDO::SQLSRV_CURSOR_KEYSET
PDO_SQLSRV とクライアント側のカーソル
クライアント側のカーソルはバージョン 3.0 の Microsoft SQL Server 用 Drivers for PHP で追加されました。これを使用すると、結果セット全体をメモリにキャッシュすることができます。 利点の 1 つは、クエリの実行後に行数を使用できることです。
クライアント側のカーソルは、小規模から中規模の結果セットに対して使用する必要があります。 大規模な結果セットの場合は、サーバー側のカーソルを使用する必要があります。
クライアント側のカーソルを使用しているときにバッファーが結果セット全体を保持するために十分な大きさではない場合、クエリから false が返されます。 バッファーのサイズは PHP メモリの上限まで増やすことができます。
PDO::setAttribute または PDOStatement::setAttribute の PDO::SQLSRV_ATTR_CLIENT_BUFFER_MAX_KB_SIZE
の属性を使用すると、結果セットを保持するバッファーのサイズを構成することができます。 php.ini ファイルで pdo_sqlsrv.client_buffer_max_kb_size を使用して最大バッファー サイズを設定することもできます (たとえば、pdo_sqlsrv.client_buffer_max_kb_size = 1024)。
PDO::prepare を使用し、PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL
カーソルの種類を指定し、その後 PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_BUFFERED
を指定することで、クライアント側のカーソルを要求できます。
例
次の例は、バッファー処理されたカーソルを指定する方法を示しています。
<?php
$database = "AdventureWorks";
$server = "(local)";
$conn = new PDO( "sqlsrv:server=$server ; Database = $database", "", "");
$query = "select * from Person.ContactType";
$stmt = $conn->prepare( $query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_BUFFERED));
$stmt->execute();
print $stmt->rowCount();
echo "\n";
while ( $row = $stmt->fetch( PDO::FETCH_ASSOC ) ){
print "$row[Name]\n";
}
echo "\n..\n";
$row = $stmt->fetch( PDO::FETCH_BOTH, PDO::FETCH_ORI_FIRST );
print_r($row);
$row = $stmt->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_REL, 1 );
print "$row[Name]\n";
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT );
print "$row[1]\n";
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_PRIOR );
print "$row[1]..\n";
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_ABS, 0 );
print_r($row);
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_LAST );
print_r($row);
?>