カーソルの種類 (PDO_SQLSRV ドライバー)

PHP ドライバーのダウンロード

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::setAttributePDO::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);
?>

参照

カーソルの種類を指定し、行を選択する