Partilhar via


Escrevendo aplicativos ODBC 3.x

Quando uma aplicação ODBC 2.x é atualizada para ODBC 3.x, deve ser escrita de forma a funcionar tanto com os drivers ODBC 2.x como 3.x . A aplicação deve incorporar código condicional para tirar pleno proveito das funcionalidades ODBC 3.x .

O atributo SQL_ATTR_ODBC_VERSION ambiente deve ser definido como SQL_OV_ODBC2. Isto garantirá que o driver se comporta como um driver ODBC 2.x relativamente às alterações descritas na secção Alterações Comportamentais.

Se a aplicação utilizar alguma das funcionalidades descritas na secção Novas Funcionalidades, deve ser usado código condicional para determinar se o driver é um driver ODBC 3.x ou ODBC 2.x . A aplicação utiliza SQLGetDiagField e SQLGetDiagRec para obter ODBC 3.x SQLSTATEs enquanto processa erros nestes fragmentos de código condicional. Os seguintes pontos sobre a nova funcionalidade devem ser considerados:

  • Uma aplicação afetada pela alteração no comportamento do tamanho do conjunto de linhas deve ter cuidado para não chamar SQLFetch quando o tamanho do array é superior a 1. Estas aplicações devem substituir chamadas para SQLExtendedFetch por chamadas para SQLSetStmtAttr para definir o atributo da instrução SQL_ATTR_ARRAY_STATUS_PTR e para SQLFetchScroll, para que tenham código comum que funcione tanto com os drivers ODBC 3.x como ODBC 2.x . Como SQLSetStmtAttr com SQL_ATTR_ROW_ARRAY_SIZE será mapeado para SQLSetStmtAttr com SQL_ROWSET_SIZE para drivers ODBC 2.x, as aplicações podem simplesmente definir SQL_ATTR_ROW_ARRAY_SIZE para as suas operações de busca de múltiplas linhas.

  • A maioria das aplicações que estão a ser atualizadas não é realmente afetada por alterações nos códigos SQLSTATE. Para as aplicações afetadas, os utilizadores podem executar uma pesquisa e substituição automáticas na maioria dos casos, utilizando a tabela de conversão de erros na secção "SQLSTATE Mapping" para converter os códigos de erro ODBC 3.x para códigos 2.x do ODBC. Como o ODBC 3.x Driver Manager realiza o mapeamento de ODBC 2.x SQLSTATEs para ODBC 3.x SQLSTATEs, estes criadores de aplicações só precisam de verificar os ODBC 3.x SQLSTATEs e não se preocupar em incluir ODBC 2.x SQLSTATEs no código condicional.

  • Se uma aplicação fizer grande uso dos tipos de dados de data, hora e carimbo temporal, pode declarar-se uma aplicação ODBC 2.x e usar o seu código existente em vez de usar código de condicionamento.

A atualização deve também incluir os seguintes passos:

  • Chame SQLSetEnvAttr antes de alocar uma ligação para definir o atributo de ambiente SQL_ATTR_ODBC_VERSION para SQL_OV_ODBC2.

  • Substitua todas as chamadas para SQLAllocEnv, SQLAllocConnect ou SQLAllocStmt por chamadas para SQLAllocHandle pelo argumento HandleType apropriado de SQL_HANDLE_ENV, SQL_HANDLE_DBC ou SQL_HANDLE_STMT.

  • Substitua todas as chamadas para SQLFreeEnv ou SQLFreeConnect por chamadas para SQLFreeHandle pelo argumento HandleType apropriado de SQL_HANDLE_DBC ou SQL_HANDLE_STMT.

  • Substitua todas as chamadas para SQLSetConnectOption por chamadas para SQLSetConnectAttr. Se definir um atributo cujo valor é uma string, defina o argumento StringLength de forma apropriada. Alterar o argumento do Atributo de SQL_XXXX para SQL_ATTR_XXXX.

  • Substitua todas as chamadas para SQLGetConnectOption por chamadas para SQLGetConnectAttr. Se obtiver uma string ou atributo binário, defina BufferLength para o valor apropriado e passe um argumento StringLength . Alterar o argumento do Atributo de SQL_XXXX para SQL_ATTR_XXXX.

  • Substitua todas as chamadas para SQLSetStmtOption por chamadas para SQLSetStmtAttr. Se definir um atributo cujo valor é uma string, defina o argumento StringLength de forma apropriada. Alterar o argumento do Atributo de SQL_XXXX para SQL_ATTR_XXXX.

  • Substitua todas as chamadas para SQLGetStmtOption por chamadas para SQLGetStmtAttr. Se obtiver uma string ou atributo binário, defina BufferLength para o valor apropriado e passe um argumento StringLength . Alterar o argumento do Atributo de SQL_XXXX para SQL_ATTR_XXXX.

  • Substitua todas as chamadas para SQLTransact por chamadas para SQLEndTran. No caso de o handle mais à direita válido na chamada SQLTransact ser um handle de ambiente, deve-se usar um argumento HandleType de SQL_HANDLE_ENV na chamada SQLEndTran com o argumento Handle apropriado. Se o handle válido mais à direita na sua chamada SQLTransact for um handle de conexão, um argumento HandleType de SQL_HANDLE_DBC deve ser usado na chamada SQLEndTran com o argumento Handle apropriado.

  • Substitua todas as chamadas para SQLColAttributes por chamadas para SQLColAttribute. Se o argumento FieldIdentifier for SQL_COLUMN_PRECISION, SQL_COLUMN_SCALE ou SQL_COLUMN_LENGTH, não altere nada exceto o nome da função. Se não, altere FieldIdentifier de SQL_COLUMN_XXXX para SQL_DESC_XXXX. Se FieldIdentifier for SQL_DESC_CONCISE_TYPE e o tipo de dados for um tipo de dados datetime, mude para o tipo de dados ODBC 3.x correspondente.

  • Se usar cursores de bloco, cursores roláveis, ou ambos, a aplicação faz o seguinte:

    • Define o tamanho do conjunto de linhas, o tipo de cursor e a concorrência do cursor usando SQLSetStmtAttr.

    • Chama SQLSetStmtAttr para definir SQL_ATTR_ROW_STATUS_PTR para apontar para um array de registos de estado.

    • Chama SQLSetStmtAttr para definir SQL_ATTR_ROWS_FETCHED_PTR para apontar para um SQLINTEGER.

    • Realiza as ligações necessárias e executa a instrução SQL.

    • Chama SQLFetchScroll num ciclo para buscar linhas e mover-se no conjunto de resultados.

    • Caso queira obter por marcador, a aplicação chama SQLSetStmtAttr para definir SQL_ATTR_FETCH_BOOKMARK_PTR a uma variável que conterá o marcador da linha que pretende obter, e chama SQLFetchScroll com um argumento FetchOrientation de SQL_FETCH_BOOKMARK.

  • Se usar arrays de parâmetros, a aplicação faz o seguinte:

    • Chama SQLSetStmtAttr para definir o atributo SQL_ATTR_PARAMSET_SIZE para o tamanho do array de parâmetros.

    • Chama SQLSetStmtAttr para definir SQL_ATTR_ROWS_PROCESSED_PTR para apontar para variável interna UDWORD.

    • Realiza operações de preparação, associação e execução conforme apropriado.

    • Se a execução parar por algum motivo (como SQL_NEED_DATA), pode encontrar a linha "atual" de parâmetros inspecionando a localização apontada por SQL_ATTR_ROWS_PROCESSED_PTR.

Esta seção contém os seguintes tópicos.