指定游标类型和选择行

从 SQL Server Driver for PHP 的 1.1 版开始,您可以创建具有可根据游标类型以任何顺序访问的行的结果集。

游标类型

在您使用 sqlsrv_querysqlsrv_prepare 创建结果集时,可以指定游标的类型。默认情况下,使用只进游标。只进游标使您可以从结果集的第一行开始一次移动一行,直到到达结果集的末尾。这是在 SQL Server Driver for PHP 的 1.0 版中提供的唯一游标类型。

从 SQL Server Driver for PHP 的 1.1 版开始,您可以创建具有可滚动游标的结果集,这允许您以任何顺序访问结果集中的任何行。下表列出了可传递到 sqlsrv_querysqlsrv_prepare 中的 Scrollable 选项的值。

选项 说明

SQLSRV_CURSOR_FORWARD

此游标类型使您可以从结果集的第一行开始一次移动一行,直到到达结果集的末尾。

这是默认的游标类型。

sqlsrv_num_rows 为使用此游标类型创建的结果集返回一个错误。

forward 是 SQLSRV_CURSOR_FORWARD 的缩写形式。

SQLSRV_CURSOR_STATIC

此游标使您可按任何顺序访问行,但将不会反映数据库中的更改。

static 是 SQLSRV_CURSOR_STATIC 的缩写形式。

SQLSRV_CURSOR_DYNAMIC

此游标使您可按任何顺序访问行,并且将会反映数据库中的更改。

sqlsrv_num_rows 为使用此游标类型创建的结果集返回一个错误。

dynamic 是 SQLSRV_CURSOR_DYNAMIC 的缩写形式。

SQLSRV_CURSOR_KEYSET

此游标使您可按任何顺序访问行。但是,如果从表中删除某一行,键集游标将不更新行计数(返回删除的行且没有任何值)。

keyset 是 SQLSRV_CURSOR_KEYSET 的缩写形式。

如果查询生成多个结果集,则 Scrollable 选项将应用于所有结果集。

选择结果集中的行

在您创建了静态、动态或键集结果集后,可以使用 sqlsrv_fetchsqlsrv_fetch_arraysqlsrv_fetch_object 指定某一行。

下表描述可在 row 参数中指定的值。

参数 说明

SQLSRV_SCROLL_NEXT

下一行。如果您没有为可滚动结果集指定 row 参数,则该值是默认值。

SQLSRV_SCROLL_PRIOR

当前行之前的行。

SQLSRV_SCROLL_FIRST

结果集中的第一行。

SQLSRV_SCROLL_LAST

结果集中的最后一行。

SQLSRV_SCROLL_ABSOLUTE

使用 offset 参数指定的行。

SQLSRV_SCROLL_RELATIVE

使用 offset 参数指定的相对于当前行的行。允许使用负数。

示例

说明

下面的示例显示了不同游标的结果。在该示例的第 33 行上,您会看到指定不同游标的三个查询语句中的第一个。对其中的两个查询语句进行了注释。每次您运行该程序时,使用不同的游标类型可以在第 47 行上看到数据库更新的结果。

代码

<?php
$server = "server_name";
$conn = sqlsrv_connect( $server, array( 'Database' => 'test' ));
if ( $conn === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "DROP TABLE dbo.ScrollTest" );
if ( $stmt !== false ) { 
   sqlsrv_free_stmt( $stmt ); 
}

$stmt = sqlsrv_query( $conn, "CREATE TABLE ScrollTest (id int, value char(10))" );
if ( $stmt === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 1, "Row 1" ));
if ( $stmt === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 2, "Row 2" ));
if ( $stmt === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 3, "Row 3" ));
if ( $stmt === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'keyset' ));
// $stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'dynamic' ));
// $stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'static' ));

$rows = sqlsrv_has_rows( $stmt );
if ( $rows != true ) {
   die( "Should have rows" );
}

$result = sqlsrv_fetch( $stmt, SQLSRV_SCROLL_LAST );
$field1 = sqlsrv_get_field( $stmt, 0 );
$field2 = sqlsrv_get_field( $stmt, 1 );
echo "\n$field1 $field2\n";

$stmt2 = sqlsrv_query( $conn, "delete from ScrollTest where id = 3" );
// or
// $stmt2 = sqlsrv_query( $conn, "UPDATE ScrollTest SET id = 4 WHERE id = 3" );
if ( $stmt2 !== false ) { 
   sqlsrv_free_stmt( $stmt2 ); 
}

$result = sqlsrv_fetch( $stmt, SQLSRV_SCROLL_LAST );
$field1 = sqlsrv_get_field( $stmt, 0 );
$field2 = sqlsrv_get_field( $stmt, 1 );
echo "\n$field1 $field2\n";

sqlsrv_free_stmt( $stmt );
sqlsrv_close( $conn );
?>

另请参见

其他资源

检索数据