游標類型 (PDO_SQLSRV 驅動程式)

下載 PHP 驅動程式

PDO_SQLSRV 驅動程式可讓您使用數種游標之一建立可捲動的結果集。

如需有關如何使用 PDO_SQLSRV 驅動程式指定游標的資訊以及程式碼範例,請參閱 PDO::prepare。

PDO_SQLSRV 與伺服器端游標

在 Microsoft PHP for SQL Server 驅動程式 3.0 版之前,PDO_SQLSRV 驅動程式可讓您使用伺服器端僅順向或靜態資料指標建立結果集。 自適用於 SQL Server 的 Microsoft PHP 驅動程式 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 和用戶端游標

在適用於 SQL Server 的 Microsoft PHP 驅動程式 3.0 版中新增了用戶端游標,可讓您將整個結果集快取於記憶體中。 其中一個優點是執行查詢之後,就能使用資料列計數。

用戶端游標應用於小型到中型的結果集。 大量結果集應使用伺服器端游標。

使用用戶端游標時,如果緩衝區不足以容納整個結果集,查詢將傳回 false。 您可以將緩衝區大小上限提高到 PHP 記憶體限制。

您可以設定緩衝區的大小,使用 PDO::SQLSRV_ATTR_CLIENT_BUFFER_MAX_KB_SIZE 或 PDOStatement::setAttribute 的 屬性來保留結果集。 您也可以在 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);
?>