Rolagem relativa e absoluta

A maioria das opções de rolagem em SQLFetchScroll posiciona o cursor em relação à posição atual ou a uma posição absoluta. SQLFetchScroll dá suporte para efetuar fetch do próximo, do anterior, do primeiro e do último conjunto de linhas, bem como fetch relativo (efetuar fetch das n linhas do conjunto de linhas do início do conjunto de linhas atual) e fetch absoluto (efetuar fetch do conjunto de linhas que começa na linha n). Se n for negativo em um fetch absoluto, as linhas serão contadas do final do conjunto de resultados. Assim, um fetch absoluto da linha -1 significa efetuar fetch do conjunto de linhas que inicia com a última linha no conjunto de resultados.

Os cursores dinâmicos detectam linhas inseridas e excluídas do conjunto de resultados, portanto, não há um modo fácil de os cursores dinâmicos recuperarem a linha em um número específico além de ler do início do conjunto de resultados, o que provavelmente será lento. Além disso, o fetch absoluto não é muito útil em cursores dinâmicos porque os números de linha mudam à medida que as linhas são inseridas e excluídas; portanto, efetuar fetch sucessivamente do mesmo número de linha pode gerar linhas diferentes.

Os aplicativos que usam SQLFetchScroll apenas para seus recursos de cursor em bloco, como relatórios, provavelmente passarão pelo conjunto de resultados uma só vez, usando apenas a opção de efetuar fetch do próximo conjunto de linhas. Aplicativos baseados em tela, por outro lado, podem usufruir de todos os recursos do SQLFetchScroll. Se o aplicativo definir o tamanho do conjunto de linhas como o número de linhas exibidas na tela e associar os buffers de tela ao conjunto de resultados, ele poderá converter as operações da barra de rolagem diretamente em chamadas para SQLFetchScroll.

Operação de barra de rolagem Opção de rolagem SQLFetchScroll
Uma página acima SQL_FETCH_PRIOR
Uma página abaixo SQL_FETCH_NEXT
Uma linha acima SQL_FETCH_RELATIVE com FetchOffset igual a -1
Uma linha abaixo SQL_FETCH_RELATIVE com FetchOffset igual a 1
Caixa de rolagem no topo SQL_FETCH_FIRST
Caixa de rolagem na base SQL_FETCH_LAST
Posição aleatória da caixa de rolagem SQL_FETCH_ABSOLUTE

Esses aplicativos também precisam posicionar a caixa de rolagem depois de uma operação de rolagem, que requer o número da linha atual e o número de linhas. Para o número da linha atual, os aplicativos podem controlar o número da linha atual ou chamar SQLGetStmtAttr com o atributo SQL_ATTR_ROW_NUMBER para recuperá-lo.

O número de linhas no cursor, que é o tamanho do conjunto de resultados, está disponível como o campo SQL_DIAG_CURSOR_ROW_COUNT do cabeçalho de diagnóstico. O valor nesse campo é definido somente depois de SQLExecute, SQLExecDirect ou SQLMoreResult ter sido chamado. Essa contagem pode ser aproximada ou exata, dependendo das capacidades do driver. É possível determinar o suporte do driver chamando SQLGetInfo com os tipos de informações de atributos do cursor e verificando se o SQL_CA2_CRC_APPROXIMATE ou SQL_CA2_CRC_EXACT bit é retornado para o tipo de cursor.

Nunca há suporte para uma contagem exata de linhas para um cursor dinâmico. Para outros tipos de cursores, o driver pode dar suporte a contagens exatas ou aproximadas de linhas, mas não a ambas. Se o driver não der suporte para contagens exatas nem aproximadas de linhas para um tipo de cursor específico, o campo SQL_DIAG_CURSOR_ROW_COUNT conterá o número de linhas das quais foi efetuado fetch até agora. Independentemente do suporte que o driver oferece, SQLFetchScroll com uma operação de SQL_FETCH_LAST fará com que o campo SQL_DIAG_CURSOR_ROW_COUNT contenha a contagem exata de linhas.