Compartilhar via


Tipos de cursor (Driver PDO_SQLSRV)

Baixar o driver PHP

O driver PDO_SQLSRV permite que você crie conjuntos de resultados roláveis com um dos vários cursores.

Para obter informações sobre como especificar um cursor usando o driver PDO_SQLSRV e para obter exemplos do código, confira PDO::prepare.

PDO_SQLSRV e cursores do lado do servidor

Antes da versão 3.0 do Drivers da Microsoft para PHP para SQL Server, o driver PDO_SQLSRV permitia que você criasse um conjunto de resultados com um cursor estático ou somente de avanço do lado do servidor. Começando na versão 3.0 do Drivers da Microsoft para PHP para SQL Server, também estão disponíveis os cursores dinâmicos e de conjunto de chaves.

Você pode indicar o tipo de cursor do lado do servidor usando PDO::prepare para selecionar um dos seguintes tipos de cursores:

  • PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY

  • PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL

Você pode solicitar um cursor estático, dinâmico ou conjunto de chaves especificando PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL e, em seguida, passando o valor apropriado para PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE. Os valores possíveis que você pode passar para PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE para cursores do lado do servidor são:

  • PDO::SQLSRV_CURSOR_DYNAMIC

  • PDO::SQLSRV_CURSOR_STATIC

  • PDO::SQLSRV_CURSOR_KEYSET

PDO_SQLSRV e cursores do lado do cliente

Os cursores do lado do cliente foram adicionados na versão 3.0 do Drivers da Microsoft para PHP para SQL Server e permitem armazenar em cache na memória todo um conjunto de resultados. Uma vantagem é que a contagem de linhas está disponível depois que uma consulta é executada.

Os cursores do lado do cliente devem ser usados para conjuntos de resultados pequeno a médio porte. Os conjuntos de resultados de grande porte devem usar cursores do lado do servidor.

Uma consulta retornará false se o buffer não for grande o suficiente para manter todo o conjunto de resultados ao usar um cursor do lado do cliente. Você pode aumentar o tamanho do buffer até o limite de memória do PHP.

É possível configurar o tamanho do buffer que contém o conjunto de resultados com o atributo PDO::SQLSRV_ATTR_CLIENT_BUFFER_MAX_KB_SIZE de PDO::setAttribute ou PDOStatement::setAttribute. Você também pode definir o tamanho máximo do buffer no arquivo php.ini com pdo_sqlsrv.client_buffer_max_kb_size (por exemplo, pdo_sqlsrv.client_buffer_max_kb_size = 1024).

É possível solicitar um cursor do lado do cliente usando PDO::prepare, especificando o tipo de cursor PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL e, em seguida, especificando PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_BUFFERED.

Exemplo

O exemplo a seguir mostra como especificar um cursor em buffer.

<?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);
?>

Consulte Também

Especificando um tipo de cursor e selecionando linhas