Compartilhar via


TN042: Recomendações de desenvolvedor de driver ODBC

Observação

A nota técnica a seguir não foi atualizada desde que foi incluída pela primeira vez na documentação online. Como resultado, alguns procedimentos e tópicos podem estar desatualizados ou incorretos. Para obter as informações mais recentes, é recomendável que você pesquise o tópico de interesse no índice de documentação online.

Esta nota descreve as diretrizes para os gravadores de driver ODBC. Ele descreve requisitos gerais e suposições da funcionalidade ODBC que as classes do Banco de Dados MFC fazem e vários detalhes semânticos esperados. A funcionalidade de driver necessária para dar suporte aos três CRecordset modos Open (forwardOnly, instantâneo e dynaset) é descrita.

Biblioteca de Cursores do ODBC

As classes de Banco de Dados MFC apresentam funcionalidade para o usuário que, em muitos casos, supera a funcionalidade fornecida pela maioria dos drivers ODBC de nível 1. Felizmente, a Biblioteca de Cursores do ODBC se colocará em camadas entre as classes de banco de dados e o driver e fornecerá automaticamente grande parte dessa funcionalidade adicional.

Por exemplo, a maioria dos drivers 1.0 não dá suporte à rolagem para trás. A Biblioteca de Cursores pode detectar isso e armazenará em cache linhas do driver e as apresentará conforme solicitado em FETCH_PREV chamadas.SQLExtendedFetch

Outro exemplo importante de dependência da biblioteca de cursores são as atualizações posicionadas. A maioria dos drivers 1.0 também não tem atualizações posicionadas, mas a biblioteca de cursores gerará instruções de atualização que identificam uma linha de destino na fonte de dados com base em seus valores de dados armazenados em cache atuais ou em um valor de carimbo de data/hora armazenado em cache.

A biblioteca de classes nunca usa vários conjuntos de linhas. Portanto, as poucas SQLSetPos instruções são sempre aplicadas à linha 1 do conjunto de linhas.

CDatabases

Cada CDatabase um aloca um único HDBC. (Se CDatabasea função 's ExecuteSQL for usada, um HSTMT será temporariamente alocado.) Portanto, se vários CDatabase's são necessários, vários HDBCs por HENV devem ter suporte.

As classes de banco de dados exigem a biblioteca de cursores. Isso se reflete em uma SQLSetConnections chamada SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC.

SQLDriverConnect, SQL_DRIVER_COMPLETE é usado para CDatabase::Open estabelecer a conexão com a fonte de dados.

O driver deve dar suporte SQLGetInfo SQL_ODBC_API_CONFORMANCE>a = SQL_OAC_LEVEL1, SQLGetInfo SQL_ODBC_SQL_CONFORMANCE>= SQL_OSC_MINIMUM.

Para que as transações tenham suporte para os CDatabase conjuntos de registros dependentes e seus conjuntos de registros SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR e SQL_CURSOR_ROLLBACK_BEHAVIOR deve ter SQL_CR_PRESERVE. Caso contrário, as tentativas de executar o controle de transação serão ignoradas.

SQLGetInfo SQL_DATA_SOURCE_READ_ONLY deve ter suporte. Se ele retornar "Y", nenhuma operação de atualização será executada na fonte de dados.

Se o CDatabase ReadOnly for aberto, uma tentativa de definir a fonte de dados lida somente será feita com SQLSetConnectOption SQL_ACCESS_MODE, SQL_MODE_READ_ONLY.

Se os identificadores exigirem aspas, essas informações deverão ser retornadas do driver com uma SQLGetInfo SQL_IDENTIFIER_QUOTE_CHAR chamada.

Para fins de depuração e SQLGetInfo SQL_DBMS_VERSQL_DBMS_NAME são recuperados do driver.

SQLSetStmtOption SQL_QUERY_TIMEOUTe SQL_ASYNC_ENABLE podem ser chamados em um CDatabaseHDBC.

SQLError pode ser chamado com qualquer ou todos os argumentos NULL.

Claro, SQLAllocEnve SQLAllocConnectSQLDisconnectSQLFreeConnect deve ter suporte.

ExecuteSQL

Além de alocar e liberar um HSTMT temporário, ExecuteSQL chamadas SQLNumResultColSQLExecDirectSQLFetche .SQLMoreResults SQLCancel pode ser chamado no HSTMT.

GetDatabaseName

SQLGetInfo SQL_DATABASE_NAME será chamado.

BeginTrans, CommitTrans, Rollback

SQLSetConnectOption SQL_AUTOCOMMITeSQLTransact SQL_COMMIT, SQL_ROLLBACK e SQL_AUTOCOMMIT serão chamados se as solicitações de transação forem feitas.

CRecordsets

SQLAllocStmt, SQLPrepare( SQLExecute For Open e Requery), SQLExecDirect (para operações de atualização), SQLFreeStmt deve ter suporte. SQLNumResultCols e SQLDescribeCol será chamado no conjunto de resultados em vários momentos.

SQLSetParam é usado extensivamente para associar dados de parâmetro e DATA_AT_EXEC funcionalidade.

SQLBindCol é usado extensivamente para registrar locais de armazenamento de dados de coluna de saída com ODBC.

Duas SQLGetData chamadas são usadas para recuperar dados SQL_LONG_VARCHAR e SQL_LONG_VARBINARY . A primeira chamada tenta localizar o comprimento total do valor da coluna chamando SQLGetData com cbMaxValue de 0, mas com um pcbValue válido. Se pcbValue mantiver SQL_NO_TOTAL, uma exceção será gerada. Caso contrário, um HGLOBAL é alocado e outra SQLGetData chamada feita para recuperar todo o resultado.

Atualização

Se o bloqueio pessimista for solicitado, SQLGetInfo SQL_LOCK_TYPES será consultado. Se não houver suporte para SQL_LCK_EXCLUSIVE , uma exceção será gerada.

As tentativas de atualizar um CRecordset (instantâneo ou dynaset) farão com que um segundo HSTMT seja alocado. Para drivers que não dão suporte ao segundo HSTMT, a biblioteca de cursores simulará essa funcionalidade. Infelizmente, isso às vezes pode significar forçar a consulta atual no primeiro HSTMT a ser concluída antes de processar a solicitação do segundo HSTMT.

SQLFreeStmt SQL_CLOSE e SQL_RESET_PARAMS e SQLGetCursorName serão chamados durante as operações de atualização.

Se houver CLongBinarys nos outputColumns, a funcionalidade de DATA_AT_EXEC do ODBC deverá ter suporte. Isso inclui retornar SQL_NEED_DATA de SQLExecDirect, SQLParamData e SQLPutData.

SQLRowCount é chamado após a execução para verificar se apenas 1 registro foi atualizado pelo SQLExecDirect.

Cursores ForwardOnly

Somente SQLFetch é necessário para as Move operações. Observe que os cursores forwardOnly não dão suporte a atualizações.

Cursores de instantâneo

A funcionalidade de instantâneo requer SQLExtendedFetch suporte. Conforme observado acima, a biblioteca de cursores ODBC detectará quando um driver não oferece suporte SQLExtendedFetche fornecerá o suporte necessário em si.

SQLGetInfo, SQL_SCROLL_OPTIONS deve dar suporte a SQL_SO_STATIC.

Cursores de Dynaset

Abaixo está o suporte mínimo necessário para abrir um dynaset:

SQLGetInfo, SQL_ODBC_VER deve retornar > "01".

SQLGetInfo, SQL_SCROLL_OPTIONS deve dar suporte a SQL_SO_KEYSET_DRIVEN.

SQLGetInfo, SQL_ROW_UPDATES deve retornar "Y".

SQLGetInfo, SQL_POSITIONED_UPDATES deve dar suporte a SQL_PS_POSITIONED_DELETE e SQL_PS_POSITIONED_UPDATE.

Além disso, se o bloqueio pessimista for solicitado, será feita uma chamada com SQLSetPos irow 1, fRefresh FALSE e fLock SQL_LCK_EXCLUSIVE .

Consulte também

Notas técnicas por número
Notas técnicas por categoria