TN042: Recomendações de desenvolvedor do driver ODBC
Observação: |
---|
A seguinte nota técnica não foi atualizada desde que foi incluída pela primeira vez na documentação online.sistema autônomo resultado, alguns procedimentos e tópicos podem estar desatualizado ou incorreto.Para obter informações mais recentes, é recomendável que você procurar o tópico de interesse no índice de documentação online. |
Esta nota descreve diretrizes para os autores de driver ODBC.Descreve requisitos Geral e suposições da funcionalidade do ODBC que tornam as classes de banco de dados MFC e diversos detalhes de semânticos esperados.Funcionalidade de driver necessárias para dar suporte a três CRecordset Modos de abertura)forwardOnly, instantâneo and tipo dynaset) são descritos.
biblioteca de cursores do ODBC
As classes de banco de dados MFC apresenta funcionalidade ao usuário que em muitos casos ultrapassa a funcionalidade fornecida pela maioria dos drivers ODBC de nível 1.Felizmente, biblioteca de cursores do ODBC será camada 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 rolar para trás.A biblioteca de cursores pode detectar e irá linhas a partir do driver de cache e apresentá-los conforme solicitado em chamadas FETCH_PREV em SQLExtendedFetch.
Outro exemplo importante de dependência da biblioteca de cursores é posicionadas atualizações.A maioria dos drivers 1.0 também não têm atualizações posicionadas, mas o cursor biblioteca irão gerar instruções de atualização que identificam uma linha de destino na fonte de dados baseada em seus valores de dados em cache corrente ou um valor de carimbo de data/hora armazenados em cache.
A biblioteca de classes nunca faz uso de vários conjuntos de linhas.Portanto, a alguns SQLSetPos instruções sempre são aplicadas a linha 1 do conjunto de linhas.
CDatabases
Cada CDatabase aloca um único HDBC.(If CDatabase's ExecuteSQL função é usada, um HSTMT temporariamente é alocado.) Portanto, se vários CDatabasedo forem necessários, vários HDBCs per HENV deve ser suportada.
As classes de banco de dados exigem que a biblioteca de cursores.Isso é refletido em um SQLSetConnections telefonar SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC.
SQLDriverConnect, SQL_DRIVER_COMPLETE é usado por CDatabase::Open para estabelecer a conexão com a fonte de dados.
The driver must support SQLGetInfo SQL_ODBC_API_CONFORMANCE >= SQL_OAC_LEVEL1, SQLGetInfo SQL_ODBC_SQL_CONFORMANCE >= SQL_OSC_MINIMUM.
In order for transactions to be supported for the CDatabase and its dependent recordsets, SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR and SQL_CURSOR_ROLLBACK_BEHAVIOR must have SQL_CR_PRESERVE.Caso contrário, tentativas de executar o controle da transação serão ignoradas.
SQLGetInfo SQL_DATA_SOURCE_READ_ONLY must be supported.Se ela retorna "Y", não há operações de atualização serão executadas na fonte de dados.
If the CDatabase is opened ReadOnly, an attempt to set the data source read only will be made with SQLSetConnectOption SQL_ACCESS_MODE, SQL_MODE_READ_ONLY.
If identifiers require quoting, this information should be returned from the driver with an SQLGetInfo SQL_IDENTIFIER_QUOTE_CHAR call.
Para fins, de depuraçãoSQLGetInfo SQL_DBMS_VER and SQL_DBMS_NAME são recuperados do driver.
SQLSetStmtOption SQL_QUERY_TIMEOUT and SQL_ASYNC_ENABLE may be called on a CDatabase's HDBC.
SQLError pode ser chamado com qualquer ou todos os argumentos nulo.
Obviamente, SQLAllocEnv, SQLAllocConnect, SQLDisconnect and SQLFreeConnect deve ser suportada.
ExecuteSQL
Além de alocar e liberação de um temporário paraHSTMT, ExecuteSQL chamadas SQLExecDirect, SQLFetch, SQLNumResultCol and SQLMoreResults. SQLCancel pode ser chamado no HSTMT.
GetDatabaseName
SQLGetInfo SQL_DATABASE_NAME will be called.
BeginTrans, CommitTrans e reversão
SQLSetConnectOption SQL_AUTOCOMMIT and SQLTransact SQL_COMMIT, SQL_ROLLBACK and SQL_AUTOCOMMIT will be called if transaction requests are made.
CRecordsets
SQLAllocStmt, SQLPrepare, SQLExecute (For em aberto and Repetir a consulta), SQLExecDirect (para operações de atualização), SQLFreeStmt deve ser suportada.SQLNumResultCols and SQLDescribeCol será chamado nos resultados definida em diversos horários.
SQLSetParam é usado amplamente para ligação de dados de parâmetro e DATA_AT_EXEC funcionalidade.
SQLBindCol é usado amplamente para registrar a saída de locais de armazenamento de dados de coluna com ODBC.
Two SQLGetData chamadas são usadas para recuperar SQL_LONG_VARCHAR and SQL_LONG_VARBINARY dados.A primeira telefonar tenta encontrar o comprimento total do valor da coluna chamando SQLGetData com cbMaxValue 0, mas com um pcbValue válido.Se pcbValue contém SQL_NO_TOTAL, uma exceção é lançada.Caso contrário, um HGLOBAL é alocado e outro SQLGetData telefonar feita para recuperar todo o resultado.
Atualizando
If pessimistic locking is requested, SQLGetInfo SQL_LOCK_TYPES will be queried.If SQL_LCK_EXCLUSIVENão há suporte para , uma exceção será lançada.
Tenta atualizar um CRecordset (instantâneo or tipo dynaset) fará com que um segundo HSTMT a ser alocada.Para drivers que não oferecem suporte à segunda HSTMT, o cursor biblioteca simulará a essa funcionalidade.Infelizmente, isso pode às vezes significar forçando a consulta corrente sobre a primeira HSTMT para conclusão antes de processar o segundo HSTMT da solicitação.
SQLFreeStmt SQL_CLOSE and SQL_RESET_PARAMS and SQLGetCursorName will be called during update operations.
Se não houver CLongBinarys in the outputColumns, DATA_AT_EXEC funcionalidade deve ser suportada.Isso inclui retornando SQL_NEED_DATA from SQLExecDirect, SQLParamData and SQLPutData.
SQLRowCount é chamado após a execução para verificar se apenas um registro foi atualizado pelo SQLExecDirect.
Cursores ForwardOnly
Apenas SQLFetch é necessário para o Mover operações.Observe que forwardOnly cursores 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 detecta quando um driver não oferece suporte a SQLExtendedFetch e fornecer o suporte necessário propriamente dito.
SQLGetInfo, SQL_SCROLL_OPTIONS deve oferecer suporte a SQL_SO_STATIC.
Dynaset cursores
É o suporte mínimo necessário para em em aberto um dynaset abaixo:
SQLGetInfo, SQL_ODBC_VER deve retornar > "01".
SQLGetInfo, SQL_SCROLL_OPTIONS deve oferecer suporte a SQL_SO_KEYSET_DRIVEN.
SQLGetInfo, SQL_ROW_UPDATES deve retornar "Y".
SQLGetInfo, SQL_POSITIONED_UPDATES deve oferecer suporte a SQL_PS_POSITIONED_DELETE and SQL_PS_POSITIONED_UPDATE.
Além disso, se a bloqueio pessimista solicitada, uma telefonar para SQLSetPos com irow 1, fRefresh falso e fLock SQL_LCK_EXCLUSIVE será feita.