成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

使用游標進行PHP SQLSRV查詢的方法與注意事項

瀏覽:450日期:2022-06-10 15:52:35
目錄
  • 游標類型
  • 選擇結果集中的行
  • SQLSRV Driver之服務端游標
  • SQLSRV Driver之客戶端游標

SQLSRV驅動程序允許您創建一個結果集,其中包含可以根據游標類型以任何順序訪問的行。本主題將討論客戶端(緩沖)和服務器端(非緩沖)游標及其用法。

使用SQLSRV查詢時,默認情況下,使用向前游標,它允許您從結果集的第一行開始一次移動一行,直到到達結果集的末尾。當然,有時這不是你所期待的,這就需要指定游標類型。

游標類型

您可以使用Scrollable來指定結果集的游標,以實現各種以順序訪問結果集中的任何行。下表列出了可以傳遞給Scrollable的選項。

OptionDescriptionSQLSRV_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的縮寫形式。SQLSRV_CURSOR_CLIENT_BUFFERED允許您以任何順序訪問行。創建客戶端游標查詢。 buffered;是SQLSRV_CURSOR_CLIENT_BUFFERED的縮寫形式。

如果查詢生成多個結果集,則Scrollable選項應用于所有結果集。

選擇結果集中的行

創建結果集后,就可以使用sqlsrv_fetch、sqlsrv_fetch_array或sqlsrv_fetch_object來指定行了。

下表說明了可以對行進行的操作。

參數描述SQLSRV_SCROLL_NEXT指定下一行。SQLSRV_SCROLL_PRIOR指定當前行之前的行。SQLSRV_SCROLL_FIRST指定結果集中的第一行。SQLSRV_SCROLL_LAST指定結果集中的最后一行。SQLSRV_SCROLL_ABSOLUTE指定指定的行抵消參數。SQLSRV_SCROLL_RELATIVE指定指定的行抵消當前行中的參數。

SQLSRV Driver之服務端游標

以下示例顯示了各種游標的效果。在示例的第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 );  
?>

SQLSRV Driver之客戶端游標

客戶端游標是Microsoft Drivers for PHP for SQL Server 3.0版中添加的一項功能,它允許您在內存中緩存整個結果集。使用客戶端游標執行查詢后,行計數可用。

客戶端游標應該用于中小型結果集。對大型結果集使用服務器端游標。

如果緩沖區不夠大,無法容納整個結果集,則查詢將返回false。您可以將緩沖區大小增加到PHP內存限制。

使用SQLSRV驅動程序,可以使用sqlsrv_configure來設置ClientBufferMaxKBSize以配置保存結果集的緩沖區的大小。

sqlsrv_get_config返回ClientBufferMaxKBSize的值。

您還可以在php.ini文件中使用sqlsrv.ClientBufferMaxKBSize來設置最大緩沖區大小(例如,sqlsrv.clientBufferMaxKBSign=1024)。

以下示例顯示:

1、行計數始終可用于客戶端游標。

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)并配置了不同的客戶端緩沖區大小。

<?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";  
}  
?>

到此這篇關于使用游標進行PHP SQLSRV查詢的方法與注意事項的文章就介紹到這了,更多相關PHP SQLSRV游標查詢內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: PHP
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲狠狠爱一区二区三区| 一区二区成人在线视频 | 久久天天狠狠| 曰韩精品一区二区| 亚洲国产片色| 国产精品三级电影| 欧美特黄一区| 中文字幕乱码亚洲精品一区| 99久久99久久精品免费观看| 日韩精品在线一区| 成人av中文字幕| 欧美r级电影在线观看| 懂色av中文一区二区三区| 欧美一区二区三区在线电影| 国产一区二区三区精品欧美日韩一区二区三区 | 国产视频一区在线播放| 成人av网站在线观看| 日韩一级片在线观看| 国产一区二区三区av电影| 欧美日韩国产中文| 国产综合色精品一区二区三区| 在线精品视频一区二区三四| 久久精品国产77777蜜臀| 欧美影院一区二区| 视频一区视频二区中文| 一本久道中文字幕精品亚洲嫩| 亚洲成人av福利| 久久成人亚洲| 视频一区二区三区在线| 欧美在线观看禁18| 狠狠网亚洲精品| 6080yy午夜一二三区久久| 国产在线精品一区二区不卡了| 欧美日韩另类一区| 国产精一品亚洲二区在线视频| 欧美日韩一区视频| 国产一区二区电影| 日韩视频免费观看高清在线视频| 国产伦精品一区二区三区免费迷| 在线不卡中文字幕| 成人午夜在线视频| 久久午夜老司机| 午夜精品免费| 亚洲人成亚洲人成在线观看图片| 国产午夜久久| 无码av免费一区二区三区试看| 91黄视频在线| 国产自产v一区二区三区c| 日韩精品一区二区三区在线观看| 91亚洲男人天堂| 最新日韩av在线| 一本色道久久综合| 日韩电影在线一区二区三区| 欧美日韩不卡在线| 不卡的电影网站| 中文字幕日韩精品一区| 欧美一级专区| 国内精品伊人久久久久av影院| 日韩精品中文字幕在线不卡尤物 | 亚洲欧美一区二区原创| 一区在线播放视频| 亚洲免费综合| 久久99久久99小草精品免视看| 精品日韩欧美一区二区| 国产综合色产| 日韩—二三区免费观看av| 欧美一二三四在线| 激情综合自拍| 亚洲午夜影视影院在线观看| 欧美日韩国产另类不卡| 波多野结衣一区二区三区 | 日韩视频在线观看国产| 免费日韩伦理电影| 91精品久久久久久久91蜜桃| 欧美ab在线视频| 亚洲综合丁香婷婷六月香| 欧美日韩日日摸| 欧美精品观看| 日韩和欧美的一区| 久久这里都是精品| 性刺激综合网| 懂色av一区二区夜夜嗨| 亚洲美女免费在线| 欧美三级电影网站| 91免费在线播放| 天堂久久一区二区三区| 精品国产一区二区在线观看| 99国产精品99久久久久久粉嫩| 久久精品国产**网站演员| 国产欧美精品一区二区三区四区| 久久精品观看| 99久久综合狠狠综合久久| 午夜婷婷国产麻豆精品| 欧美一区二区三区精品| 亚洲精品男同| 国产精品99精品久久免费| 亚洲欧美日韩在线不卡| 欧美另类高清zo欧美| 韩日在线一区| 国产在线观看一区二区| 亚洲精品国久久99热| 日韩一级二级三级精品视频| 国产乱码精品| 成人中文字幕合集| 亚洲国产人成综合网站| 亚洲精品在线免费播放| 一本久久精品一区二区| 国产一区激情| 国产在线视频不卡二| 亚洲男人的天堂在线观看| 在线播放91灌醉迷j高跟美女 | 国产成人精品影院| 一区二区日韩电影| 亚洲精品一区二区三区99| 久久久久久久久久久一区| 91色乱码一区二区三区| 久久精品国产亚洲一区二区三区| 综合久久综合久久| 欧美电影免费观看完整版| 免费久久久一本精品久久区 | 亚洲视频www| 成人av资源在线观看| 天天色 色综合| 国产视频一区二区在线| 欧美日韩一区二区三区视频| 亚洲精品极品| 99精品在线免费| 韩国v欧美v日本v亚洲v| 日韩久久一区二区| 日韩免费在线观看| 亚洲一区二区三区午夜| 91啪亚洲精品| 国产精品综合一区二区| 三级在线观看一区二区| 成人欧美一区二区三区视频网页| 日韩欧美激情四射| 欧美午夜精品一区二区蜜桃| 一区二区国产在线观看| 午夜免费电影一区在线观看| 国产盗摄一区二区| 美女看a上一区| 亚洲一区二区在线免费观看视频| 国产免费成人在线视频| 日韩欧美专区在线| 欧美影视一区二区三区| 国产日韩久久| 极品少妇一区二区三区| 97se亚洲国产综合在线| 精品一二线国产| 亚洲成av人在线观看| 亚洲精品视频自拍| 国产欧美久久久精品影院| 久久影院午夜片一区| 欧美精品一二三| 久久精品日产第一区二区| 中文亚洲字幕| 亚洲国产欧美国产综合一区| 欧美午夜不卡| 91丝袜呻吟高潮美腿白嫩在线观看| 国产成人综合在线观看| 九九九久久久精品| 日本伊人午夜精品| 日韩和的一区二区| 日日摸夜夜添夜夜添精品视频| 亚洲国产精品久久久久婷婷884| 亚洲欧美经典视频| 自拍av一区二区三区| 国产精品剧情在线亚洲| 国产欧美日本一区二区三区| 国产视频一区在线播放| 国产欧美一区二区在线| 国产欧美精品一区二区三区四区 | 国产在线精品免费| 久久国产精品无码网站| 日本麻豆一区二区三区视频| 亚欧色一区w666天堂| 亚洲高清不卡在线| 亚洲一区二区三区中文字幕在线 | 日韩欧美国产三级电影视频| 欧美一区二区三区视频免费播放| 精品婷婷伊人一区三区三| 在线视频亚洲一区| 在线观看国产日韩| 欧美视频精品在线| 欧美精品国产精品| 91精品国产综合久久久久久漫画| 8x8x8国产精品| 日韩欧美123| 精品国产一区二区三区四区四 | 午夜精品久久久久| 日韩和欧美的一区| 精品无人区卡一卡二卡三乱码免费卡 | 国产综合亚洲精品一区二| 黄色精品网站| 中日韩男男gay无套| 亚洲一区中文| 久久欧美肥婆一二区| 一本久久精品一区二区| 欧美最新大片在线看| 欧美调教femdomvk|