使用游標進行PHP SQLSRV查詢的方法與注意事項
SQLSRV驅(qū)動程序允許您創(chuàng)建一個結(jié)果集,其中包含可以根據(jù)游標類型以任何順序訪問的行。本主題將討論客戶端(緩沖)和服務(wù)器端(非緩沖)游標及其用法。
使用SQLSRV查詢時,默認情況下,使用向前游標,它允許您從結(jié)果集的第一行開始一次移動一行,直到到達結(jié)果集的末尾。當然,有時這不是你所期待的,這就需要指定游標類型。
游標類型
您可以使用Scrollable來指定結(jié)果集的游標,以實現(xiàn)各種以順序訪問結(jié)果集中的任何行。下表列出了可以傳遞給Scrollable的選項。
| Option | Description |
|---|---|
| SQLSRV_CURSOR_FORWARD | 允許您從結(jié)果集的第一行開始一次移動一行,直到到達結(jié)果集的末尾。 這是默認的游標類型。 sqlsrv_num_rows將返回一個錯誤。 forward;是SQLSRV_CURSOR_FORWARD的縮寫形式。 |
| SQLSRV_CURSOR_STATIC | 允許您以任何順序訪問行,但不會反映數(shù)據(jù)庫中的更改。 static;是SQLSRV_CURSOR_STATIC的縮寫形式。 |
| SQLSRV_CURSOR_DYNAMIC | 允許您以任何順序訪問行,并反映數(shù)據(jù)庫中的更改。 sqlsrv_num_rows將返回一個錯誤。 dynamic;是SQLSRV_CURSOR_DYNAMIC的縮寫形式。 |
| SQLSRV_CURSOR_KEYSET | 允許您以任何順序訪問行。但是,如果從表中刪除了一行,鍵集游標不會更新行計數(shù)(刪除的行返回時沒有值)。 keyset;是SQLSRV_CURSOR_KEYSET的縮寫形式。 |
| SQLSRV_CURSOR_CLIENT_BUFFERED | 允許您以任何順序訪問行。創(chuàng)建客戶端游標查詢。 buffered;是SQLSRV_CURSOR_CLIENT_BUFFERED的縮寫形式。 |
如果查詢生成多個結(jié)果集,則Scrollable選項應用于所有結(jié)果集。
選擇結(jié)果集中的行
創(chuàng)建結(jié)果集后,就可以使用sqlsrv_fetch、sqlsrv_fetch_array或sqlsrv_fetch_object來指定行了。
下表說明了可以對行進行的操作。
| 參數(shù) | 描述 |
|---|---|
| SQLSRV_SCROLL_NEXT | 指定下一行。 |
| SQLSRV_SCROLL_PRIOR | 指定當前行之前的行。 |
| SQLSRV_SCROLL_FIRST | 指定結(jié)果集中的第一行。 |
| SQLSRV_SCROLL_LAST | 指定結(jié)果集中的最后一行。 |
| SQLSRV_SCROLL_ABSOLUTE | 指定指定的行抵消參數(shù)。 |
| SQLSRV_SCROLL_RELATIVE | 指定指定的行抵消當前行中的參數(shù)。 |
SQLSRV Driver之服務(wù)端游標
以下示例顯示了各種游標的效果。在示例的第33行,您可以看到指定不同游標的三條查詢語句中的第一條。其中兩個查詢語句被注釋。每次運行程序時,使用不同的游標類型查看第47行上的數(shù)據(jù)庫更新效果。
<?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 );
?>SQLSRV Driver之客戶端游標
客戶端游標是Microsoft Drivers for PHP for SQL Server 3.0版中添加的一項功能,它允許您在內(nèi)存中緩存整個結(jié)果集。使用客戶端游標執(zhí)行查詢后,行計數(shù)可用。
客戶端游標應該用于中小型結(jié)果集。對大型結(jié)果集使用服務(wù)器端游標。
如果緩沖區(qū)不夠大,無法容納整個結(jié)果集,則查詢將返回false。您可以將緩沖區(qū)大小增加到PHP內(nèi)存限制。
使用SQLSRV驅(qū)動程序,可以使用sqlsrv_configure來設(shè)置ClientBufferMaxKBSize以配置保存結(jié)果集的緩沖區(qū)的大小。
sqlsrv_get_config返回ClientBufferMaxKBSize的值。
您還可以在php.ini文件中使用sqlsrv.ClientBufferMaxKBSize來設(shè)置最大緩沖區(qū)大小(例如,sqlsrv.clientBufferMaxKBSign=1024)。
以下示例顯示:
1、行計數(shù)始終可用于客戶端游標。
2、使用客戶端游標和批處理語句。
<?php
$serverName = "(local)";
$connectionInfo = array("Database"=>"AdventureWorks");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if ( $conn === false ) {
echo "Could not connect.\n";
die( print_r( sqlsrv_errors(), true));
}
$tsql = "select * from HumanResources.Department";
// Execute the query with client-side cursor.
$stmt = sqlsrv_query($conn, $tsql, array(), array("Scrollable"=>"buffered"));
if (! $stmt) {
echo "Error in statement execution.\n";
die( print_r( sqlsrv_errors(), true));
}
// row count is always available with a client-side cursor
$row_count = sqlsrv_num_rows( $stmt );
echo "\nRow count = $row_count\n";
// Move to a specific row in the result set.
$row = sqlsrv_fetch($stmt, SQLSRV_SCROLL_FIRST);
$EmployeeID = sqlsrv_get_field( $stmt, 0);
echo "Employee ID = $EmployeeID \n";
// Client-side cursor and batch statements
$tsql = "select top 2 * from HumanResources.Employee;Select top 3 * from HumanResources.EmployeeAddress";
$stmt = sqlsrv_query($conn, $tsql, array(), array("Scrollable"=>"buffered"));
if (! $stmt) {
echo "Error in statement execution.\n";
die( print_r( sqlsrv_errors(), true));
}
$row_count = sqlsrv_num_rows( $stmt );
echo "\nRow count for first result set = $row_count\n";
$row = sqlsrv_fetch($stmt, SQLSRV_SCROLL_FIRST);
$EmployeeID = sqlsrv_get_field( $stmt, 0);
echo "Employee ID = $EmployeeID \n";
sqlsrv_next_result($stmt);
$row_count = sqlsrv_num_rows( $stmt );
echo "\nRow count for second result set = $row_count\n";
$row = sqlsrv_fetch($stmt, SQLSRV_SCROLL_LAST);
$EmployeeID = sqlsrv_get_field( $stmt, 0);
echo "Employee ID = $EmployeeID \n";
?>以下示例顯示了使用sqlsrv_prepare(sqlsrv_prepare)并配置了不同的客戶端緩沖區(qū)大小。
<?php
$serverName = "(local)";
$connectionInfo = array( "Database"=>"AdventureWorks");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if ( $conn === false ) {
echo "Could not connect.\n";
die( print_r( sqlsrv_errors(), true));
}
$tsql = "select * from HumanResources.Employee";
$stmt = sqlsrv_prepare( $conn, $tsql, array(), array("Scrollable" => SQLSRV_CURSOR_CLIENT_BUFFERED, "ClientBufferMaxKBSize" => 51200));
if (! $stmt ) {
echo "Statement could not be prepared.\n";
die( print_r( sqlsrv_errors(), true));
}
sqlsrv_execute( $stmt);
$row_count = sqlsrv_num_rows( $stmt );
if ($row_count)
echo "\nRow count = $row_count\n";
$row = sqlsrv_fetch($stmt, SQLSRV_SCROLL_FIRST);
if ($row ) {
$EmployeeID = sqlsrv_get_field( $stmt, 0);
echo "Employee ID = $EmployeeID \n";
}
?>到此這篇關(guān)于使用游標進行PHP SQLSRV查詢的方法與注意事項的文章就介紹到這了,更多相關(guān)PHP SQLSRV游標查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
實現(xiàn)了一個PHP5的getter/setter基類的代碼
實現(xiàn)了一個PHP5的getter/setter基類的代碼...2007-02-02

