Partilhar via


Biblioteca de cursores ODBC

Alguns drivers ODBC só dão suporte a configurações de cursor padrão; esses drivers também não dão suporte a operações de cursor posicionadas, como SQLSetPos. A biblioteca de cursores ODBC é um componente do MDAC (Microsoft Data Access Components) usado para implementar cursores estáticos ou em bloco em um driver que, normalmente, não dá suporte a eles. A biblioteca de cursores também implementa as instruções UPDATE e DELETE posicionadas e SQLSetPos nos cursores criados.

A biblioteca de cursores ODBC é implementada como uma camada entre o Gerenciador de Driver ODBC e um driver ODBC. Se a biblioteca de cursores ODBC for carregada, o Gerenciador de Driver ODBC roteará todos os comandos relacionados com o cursor à biblioteca em vez do driver. A biblioteca de cursores implementa um cursor buscando o conjunto de resultados inteiro do driver subjacente e armazenando em cache o conjunto de resultados no cliente. Ao usar a biblioteca de cursores ODBC, o aplicativo fica limitado à funcionalidade da biblioteca; qualquer suporte adicional a outras funcionalidades de cursor no driver subjacente não estará disponível para o aplicativo.

Não há muita necessidade de usar a biblioteca de cursores ODBC com o driver ODBC do SQL Server Native Client porque o próprio driver dá suporte a mais funcionalidades de cursor do que a biblioteca. A única razão para usar a biblioteca de cursores ODBC com o driver ODBC do SQL Server Native Client é porque o driver implementa seu suporte a cursor por meio de cursores de servidor, e os cursores de servidor não dão suporte a todas as instruções SQL. Sempre que houver necessidade de ter um cursor estático com procedimentos armazenados, lotes ou instruções SQL que contêm COMPUTE, COMPUTE BY, FOR BROWSE ou INTO, é recomendável usar a biblioteca de cursores ODBC. No entanto, é preciso ter cuidado ao usar a biblioteca de cursores porque ela armazena no cache do cliente o conjunto de resultados inteiro, o que pode alocar muita memória e prejudicar o desempenho.

Um aplicativo invoca a biblioteca de cursores para cada conexão usando SQLSetConnectAttr para definir o atributo de conexão SQL_ATTR_ODBC_CURSORS antes de estabelecer uma conexão com uma fonte de dados. SQL_ATTR_ODBC_CURSORS é definido como um destes três valores:

  • SQL_CUR_USE_ODBC
    Quando esta opção é definida com o driver ODBC do SQL Server Native Client, a biblioteca de cursores ODBC substitui o suporte nativo do cursor do driver ODBC do SQL Server Native Client. Somente os tipos de cursor suportados pela biblioteca de cursores podem ser usados para a conexão; cursores de servidor não podem ser usados.

  • SQL_CUR_USE_DRIVER
    Quando esta opção é definida, todo o suporte nativo do cursor ao driver ODBC do SQL Server Native Client pode ser usado para a conexão. A biblioteca de cursores ODBC não pode ser usada. Todos os cursores são implementados como cursores de servidor.

  • SQL_CUR_USE_IF_NEEDED
    Quando esta opção é definida, ela produz o mesmo efeito que SQL_CUR_USE_DRIVER quando usada com o driver ODBC do SQL Server Native Client. No momento da conexão, o Gerenciador de Driver ODBC verifica se o driver ODBC ao qual está sendo estabelecida uma conexão dá suporte à opção SQL_FETCH_PRIOR de SQLFetchScroll. Se o driver não der suporte à opção, o Gerenciador de Driver ODBC carregará a biblioteca de cursores ODBC. Se o driver der suporte à opção, o Gerenciador não carregará a biblioteca de cursores ODBC e o aplicativo usará o suporte nativo do driver. Pelo fato de o driver ODBC do SQL Server Native Client dar suporte a SQL_FETCH_PRIOR, o Gerenciador de Driver ODBC não carrega a biblioteca de cursores ODBC.

A biblioteca de cursores permite que os aplicativos usem várias instruções ativas em uma conexão, assim como cursores roláveis e atualizáveis. A biblioteca de cursores deve ser carregada para dar suporte a essa funcionalidade. Use SQLSetConnectAttr para especificar como a biblioteca de cursores deveria ser usada e SQLSetStmtAttr para especificar o tipo de cursor, simultaneidade e tamanho do conjunto de linhas.