Cursores em bloco, cursores roláveis e compatibilidade com versões anteriores para aplicativos ODBC 3.x
A existência de SQLFetchScroll e SQLExtendedFetch representa a primeira divisão clara no ODBC entre a API (Application Programming Interface), que é o conjunto de funções que o aplicativo chama, e a SPI (Service Provider Interface), que é o conjunto de funções que o driver implementa. Essa divisão é necessária para equilibrar o requisito no ODBC 3.x, que usa SQLFetchScroll, para alinhar com os padrões e ser compatível com ODBC 2.x, que usa SQLExtendedFetch.
A API ODBC 3.x , que é o conjunto de funções que o aplicativo chama, inclui SQLFetchScroll e atributos de instrução relacionados. O ODBC 3.x SPI, que é o conjunto de funções que o driver implementa, inclui SQLFetchScroll, SQLExtendedFetch e atributos de instrução relacionados. Como o ODBC não impõe formalmente essa divisão entre a API e o SPI, é possível que aplicativos ODBC 3.x chamem SQLExtendedFetch e atributos de instrução relacionados. No entanto, não há razão para aplicativos ODBC 3.x para fazer isso. Para obter mais informações sobre APIs e SPIs, consulte a introdução à arquitetura ODBC.
Para obter informações sobre como o Gerenciador de Driver ODBC 3.x mapeia chamadas para drivers ODBC 2.x e ODBC 3.x e quais funções e atributos de instrução um driver ODBC 3.x deve implementar para cursores de bloco e roláveis, consulte O que o driver faz no Apêndice G: Diretrizes de driver para compatibilidade com versões anteriores.
A tabela a seguir resume quais funções e atributos de instrução um aplicativo ODBC 3.x deve usar com cursores de bloco e roláveis. Ele também lista as alterações entre ODBC 2.x e ODBC 3.x nesta área que os aplicativos ODBC 3.x devem estar cientes de serem compatíveis com drivers ODBC 2.x.
Função ou atributo de instrução |
Comentários |
---|---|
SQL_ATTR_FETCH_BOOKMARK_PTR | Aponta para o indicador a ser usado com SQLFetchScroll. Quando um aplicativo define isso em um driver ODBC 2.x , isso deve apontar para um indicador de comprimento fixo. |
SQL_ATTR_ROW_STATUS_PTR | Aponta para a matriz de status de linha preenchida por SQLFetch, SQLFetchScroll, SQLBulkOperations, e SQLSetPos. Se um aplicativo definir isso em um driver ODBC 2.x e chamar SQLBulkOperation com uma Operação de SQL_ADD antes de chamar SQLFetchScroll, SQLFetch, ou SQLExtendedFetch, SQLSTATE HY011 (atributo não pode ser definido aora) será retornado. Quando um aplicativo chama SQLFetch em um driver ODBC 2.x, SQLFetch é mapeado para SQLExtendedFetch e, portanto, retorna valores nessa matriz. |
SQL_ATTR_ROWS_FETCHED_PTR | Aponta para o buffer no qual SQLFetch e SQLFetchScroll retornam o número de linhas buscadas. Quando um aplicativo chama SQLFetch em um driver ODBC 2.x, SQLFetch é mapeado para SQLExtendedFetch e, portanto, retorna um valor nesse buffer. |
SQL_ATTR_ROW_ARRAY_SIZE | Define o tamanho do conjunto de linhas. Se um aplicativo chamar SQLBulkOperations com uma operação de SQL_ADD em um driver ODBC 2.x, SQL_ROWSET_SIZE será usado para a chamada, não SQL_ATTR_ROW_ARRAY_SIZE, porque a chamada é mapeada para SQLSetPos com uma operação de SQL_ADD, que usa SQL_ROWSET_SIZE. Chamar SQLSetPos com uma operação de SQL_ADD ou SQLExtendedFetch em um driver ODBC 2.x usa SQL_ROWSET_SIZE. Chamar SQLFetch ou SQLFetchScroll em um driver ODBC 2.x usa SQL_ATTR_ROW_ARRAY_SIZE. |
SQLBulkOperations | Executa operações de inserção e marcador. Quando SQLBulkOperations com uma operação de SQL_ADD é chamado em um driver ODBC 2.x, ele é mapeado para SQLSetPos com uma operação de SQL_ADD. A seguir estão os detalhes da implementação: - Ao trabalhar com um driver ODBC 2.x , um aplicativo deve usar apenas a ARD implicitamente alocada associada ao StatementHandle; ele não pode alocar outro ARD para adicionar linhas, porque operações de descritor explícito não são suportadas em um driver ODBC 2.x. Um aplicativo deve usar SQLBindCol para vincular à ARD, não SQLSetDescField ou SQLSetDescRec. - Ao chamar um driver ODBC 3.x, um aplicativo pode chamar SQLBulkOperations com uma Operação de SQL_ADD antes de chamar SQLFetch ou SQLFetchScroll. Ao chamar um driver ODBC 2.x, um aplicativo deve chamar SQLFetchScroll antes de chamar SQLBulkOperations com uma operação de SQL_ADD. |
SQLFetch | Retorna o conjunto de linhas. A seguir estão os detalhes da implementação: - Quando um aplicativo chama SQLFetch em um driver ODBC 2.x , ele é mapeado para SQLExtendedFetch. - Quando um aplicativo chama SQLFetch em um driver ODBC 3.x , ele retorna o número de linhas especificadas com o atributo de instrução SQL_ATTR_ROW_ARRAY_SIZE. |
SQLFetchScroll | Retorna o conjunto de linhas especificado. A seguir estão os detalhes da implementação: - Quando um aplicativo chama SQLFetchScroll em um driver ODBC 2.x , ele retorna SQLSTATE 01S01 (Erro na linha) antes de cada erro que se aplica a uma única linha. Ele faz isso somente porque o Gerenciador de Driver ODBC 3.x mapeia isso para SQLExtendedFetch e SQLExtendedFetch retorna esse SQLSTATE. Quando um aplicativo chama SQLFetchScroll em um driver ODBC 3.x , ele nunca retorna SQLSTATE 01S01 (erro na linha). - Quando um aplicativo chama SQLFetchScroll em um driver ODBC 2.x com FetchOrientation definido como SQL_FETCH_BOOKMARK, o argumento FetchOffset deve ser definido como 0. SQLSTATE HYC00 (recurso opcional não implementado) é retornado se a busca de marcadores baseada em deslocamento for tentada com um driver ODBC 2.x. |
Observação
Os aplicativos ODBC 3.x não devem usar SQLExtendedFetch ou o atributo de instrução SQL_ROWSET_SIZE. Em vez disso, eles devem usar SQLFetchScroll e o atributo de instrução SQL_ATTR_ROW_ARRAY_SIZE. Aplicativos ODBC 3.x não devem usar SQLSetPos com uma operação de SQL_ADD, mas devem usar SQLBulkOperations com uma operação de SQL_ADD.