TN042: ODBC Driver Developer recomendações

Esta anotação descreve as diretrizes para os criadores de driver ODBC. Ele descreve gerais requisitos e suposições da funcionalidade do ODBC que tornam as classes MFC banco de dados e várias esperados detalhes semânticas. Funcionalidade de driver necessário para suportar os três CRecordset abrir modos (forwardOnly, instantâneo e dynaset) são descritos.

Biblioteca de Cursor do ODBC

As classes de banco de dados MFC apresentam funcionalidade ao usuário que, em muitos casos, ultrapassa a funcionalidade fornecida pela maioria dos drivers ODBC de nível 1. Felizmente, Cursor biblioteca do ODBC será camada próprio 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 suportam rolagem com versões anteriores. A biblioteca de Cursor pode detectar isso e será cache linhas o driver e apresentá-los conforme solicitado em chamadas FETCH_PREV em SQLExtendedFetch.

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

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

CDatabases

Cada CDatabase aloca um único HDBC. (Se CDatabasedo ExecuteSQL função for usada, um HSTMT temporariamente é alocado.) Portanto, se forem necessários vários CDatabase, vários HDBCs por HENV devem ser apoiados.

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 pelo CDatabase:: Open para estabelecer a conexão com a fonte de dados.

O driver necessário suporte SQLGetInfo SQL_ODBC_API_CONFORMANCE gt; = SQL_OAC_LEVEL1, SQLGetInfo SQL_ODBC_SQL_CONFORMANCE > = SQL_OSC_MINIMUM.

Em ordem para as operações apoiadas para CDatabase e seus conjuntos de registros dependentes, SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR e SQL_CURSOR_ROLLBACK_BEHAVIOR devem ter SQL_CR_PRESERVE. Caso contrário, as tentativas de executar controle de transação serão ignoradas.

SQLGetInfo SQL_DATA_SOURCE_READ_ONLY deve ser apoiada. Se ela retorna "Y", nenhuma operação de atualização será executada na fonte de dados.

Se o CDatabase é aberto ReadOnly uma tentativa para definir o readonly de fonte de dados será feita com SQLSetConnectOption SQL_ACCESS_MODE, SQL_MODE_READ_ONLY.

Se identificadores requerem citando, esta informação deve ser retornada do driver com uma chamadaSQL_IDENTIFIER_QUOTE_CHAR SQLGetInfo .

Para fins de depuração, SQLGetInfo SQL_DBMS_VER e SQL_DBMS_NAME são recuperados do driver.

SQLSetStmtOption SQL_QUERY_TIMEOUT e SQL_ASYNC_ENABLE podem ser chamado em uma CDatabasedo HDBC.

SQLError pode ser chamado qualquer ou todos os argumentos NULL.

Naturalmente, SQLAllocEnv, SQLAllocConnect, SQLDisconnect e SQLFreeConnect devem ser apoiada.

ExecuteSQL

Em adicional para alocar e liberando um temporário HSTMT, ExecuteSQL chama SQLExecDirect, SQLFetch, SQLNumResultCol e SQLMoreResults. SQLCancel pode ser chamado na HSTMT.

GetDatabaseName

SQLGetInfo SQL_DATABASE_NAME será chamado.

BeginTrans, CommitTrans, Rollback

SQLSetConnectOptionSQL_AUTOCOMMIT eSQL_COMMIT SQLTransact, SQL_ROLLBACK e SQL_AUTOCOMMIT serão chamado se são feitas solicitações de transação .

CRecordsets

SQLAllocStmt, SQLPrepare, SQLExecute (para Abrir e Repetir), SQLExecDirect (para operações de atualização), SQLFreeStmt deve ser apoiada. SQLNumResultCols e SQLDescribeCol serão chamado os resultados definir em vários momentos.

SQLSetParam é usado extensivamente para ligação de dados de parâmetro e DATA_AT_EXEC funcionalidade.

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

Duas SQLGetData chamadas são usadas para recuperar dados SQL_LONG_VARCHAR e SQL_LONG_VARBINARY . A Primeiro chamada tenta localizar o comprimento total do valor da coluna, chamando SQLGetData com cbMaxValue de 0, mas com um pcbValue válido. Se pcbValue contém SQL_NO_TOTAL, uma exceção é lançada. Caso contrário um HGLOBAL é alocada e outro SQLGetData chamada feita para recuperar todo o resultado.

Atualizando

Se o bloqueio pessimista é solicitado, SQLGetInfo SQL_LOCK_TYPES vai ser consultado. Se não há suporte para SQL_LCK_EXCLUSIVE , uma exceção será lançada.

Tenta atualizar um CRecordset (instantâneo ou dynaset) fará com que um segundo HSTMT a ser alocada. Para os condutores que não suportam segundo HSTMT, a biblioteca de cursores irá simular essa funcionalidade. Infelizmente, isso pode significar, por vezes, forçando a consulta atual sobre o primeiro HSTMT a conclusão antes de processar o segundo HSTMTda solicitação.

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

Se houver CLongBinarys de outputColumns, deve suporte DATA_AT_EXEC funcionalidade do ODBC. Isso inclui retornando SQL_NEED_DATA de SQLExecDirect, SQLParamData e SQLPutData.

SQLRowCount é chamado depois de executar para verificar que apenas 1 registro foi atualizado por SQLExecDirect.

Cursores ForwardOnly

Somente SQLFetch é necessário para as operações de Mover . Anotação que forwardOnly cursores não oferecem suporte a atualizações.

Cursores de instantâneo

A funcionalidade de instantâneo requer SQLExtendedFetch suporte. Como mencionado acima, a biblioteca de cursores ODBC detectará quando um driver não suporte SQLExtendedFetche fornecem o suporte necessário propriamente dito.

SQLGetInfo, SQL_SCROLL_OPTIONS deve suportar SQL_SO_STATIC.

Cursores dynaset

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

SQL&GetInfo, SQL_ODBC_VER deve retornar gt; "01".

SQLGetInfo, SQL_SCROLL_OPTIONS deve suportar SQL_SO_KEYSET_DRIVEN.

SQLGetInfo, SQL_ROW_UPDATES deve retornar "Y".

SQLGetInfo, SQL_POSITIONED_UPDATES deve suporte SQL_PS_POSITIONED_DELETE e SQL_PS_POSITIONED_UPDATE.

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

Técnico anotações por número |nbsp; &Notas técnicas por categoria

Index