游标类型(PDO_SQLSRV 驱动程序)

下载 PHP 驱动程序

可通过 PDO_SQLSRV 驱动程序创建一个具有多个游标的可滚动结果集。

有关如何使用 PDO_SQLSRV 驱动程序指定游标的信息和代码示例,请参阅 PDO::prepare

PDO_SQLSRV 和服务器端游标

在 Microsoft Drivers for PHP for SQL Server 3.0 版本之前,PDO_SQLSRV 驱动程序允许使用服务器端只进或静态游标创建结果集。 从 Microsoft Drivers for PHP for SQL Server 的 3.0 版开始,还可以使用键集和动态游标。

可以使用 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 和客户端游标

Microsoft Drivers for PHP for SQL Server 3.0 版本中添加了客户端游标,允许在内存中缓存整个结果集。 一个优点是,在执行查询之后,行计数将可用。

客户端游标应用于中小型结果集。 较大的结果集应使用服务器端游标。

如果使用客户端游标时缓冲区不够大,无法容纳整个结果集,则查询将返回 false。 可以将缓冲区大小增加到 PHP 内存限制。

可以使用 PDO::setAttributePDOStatement::setAttributePDO::SQLSRV_ATTR_CLIENT_BUFFER_MAX_KB_SIZE 属性配置保留结果集的缓冲区的大小。 还可以使用 pdo_sqlsrv.client_buffer_max_kb_size 在 php.ini 文件中设置最大缓冲区大小(例如,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);
?>

另请参阅

指定游标类型和选择行