TN042: ODBC Driver Developer recomendações
Observação |
---|
A seguinte nota técnica 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 desatualizado ou incorreto.As informações mais recentes, é recomendável que você procure o tópico de interesse no índice de documentação on-line. |
Esta anotação descreve diretrizes para gravadores de driver ODBC.Descreve requisitos gerais e suposições da funcionalidade do ODBC que compõem as classes MFC banco de dados e diversos detalhes de semânticos esperados.Necessária a funcionalidade do driver para oferecer suporte a 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 entre as classes de banco de dados e o driver e fornecerá automaticamente grande parte essa funcionalidade adicional.
Por exemplo, a maioria dos drivers 1.0 não suportam para trás.A biblioteca de Cursor pode detectar isso e será cache linhas do 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 de posições, 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 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, poucos SQLSetPos instruções sempre são aplicadas para a linha 1 do conjunto de linhas.
CDatabases
Cada CDatabase aloca um único HDBC.(Se CDatabasedo ExecuteSQL função é usada, um HSTMT está temporariamente alocado.) Portanto, se vários CDatabasedo necessários, vários HDBCs por HENV deve ser suportada.
As classes de banco de dados exigem a biblioteca de cursor.Isso é refletido em um SQLSetConnections chamada SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC.
SQLDriverConnect, SQL_DRIVER_COMPLETE é usado por CDatabase::Open estabelecer a conexão à fonte de dados.
O driver deve suporte SQLGetInfoSQL_ODBC_API_CONFORMANCE > = SQL_OAC_LEVEL1, SQLGetInfoSQL_ODBC_SQL_CONFORMANCE > = SQL_OSC_MINIMUM.
Em ordem para transações de suporte para o CDatabase e seus conjuntos de registros dependentes, SQLGetInfoSQL_CURSOR_COMMIT_BEHAVIOR e SQL_CURSOR_ROLLBACK_BEHAVIOR deve ter SQL_CR_PRESERVE.Caso contrário, tentativas de executar o controle de transação serão ignoradas.
SQLGetInfoSQL_DATA_SOURCE_READ_ONLY deve ser suportada.Se ela retorna "Y", não há operações de atualização serão executadas na fonte de dados.
Se o CDatabase é aberto somente leitura, uma tentativa de definir a fonte de dados de leitura somente será feita com SQLSetConnectOptionSQL_ACCESS_MODE, SQL_MODE_READ_ONLY.
Se precisarem de identificadores de cotação, essa informação deve ser retornada do driver com um SQLGetInfoSQL_IDENTIFIER_QUOTE_CHAR de chamada.
Para depuração, SQLGetInfo SQL_DBMS_VER e SQL_DBMS_NAME recuperada do driver.
SQLSetStmtOptionSQL_QUERY_TIMEOUT e SQL_ASYNC_ENABLE pode ser chamado em um CDatabasedo HDBC.
SQLError pode ser chamado com todos os argumentos nulos.
Obviamente, SQLAllocEnv, SQLAllocConnect, SQLDisconnect e SQLFreeConnect deve ser suportada.
ExecuteSQL
Além de alocar e liberando temporário para HSTMT, ExecuteSQL chamadas SQLExecDirect, SQLFetch, SQLNumResultCol e SQLMoreResults.SQLCancel pode ser chamado na HSTMT.
GetDatabaseName
SQLGetInfoSQL_DATABASE_NAME será chamado.
BeginTrans, CommitTrans e Rollback
SQLSetConnectOptionSQL_AUTOCOMMIT e SQLTransactSQL_COMMIT, SQL_ROLLBACK e SQL_AUTOCOMMIT será chamado se são feitas solicitações de transação.
CRecordsets
SQLAllocStmt, SQLPrepare, SQLExecute (para Abrir e Requery), SQLExecDirect (para operações de atualização), SQLFreeStmt deve ser suportada.SQLNumResultCols e SQLDescribeCol será chamado nos resultados definir várias vezes.
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.
Dois SQLGetData chamadas são usadas para recuperar SQL_LONG_VARCHAR e SQL_LONG_VARBINARY dados.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 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 for solicitada a proteção pessimista SQLGetInfoSQL_LOCK_TYPES serão consultados.Se SQL_LCK_EXCLUSIVE não é suportado, uma exceção será lançada.
Tenta atualizar um CRecordset (instantâneo ou dynaset) causará uma segunda HSTMT a ser alocada.Para drivers que não oferecem suporte a segunda HSTMT, a biblioteca de cursores irá simular essa funcionalidade.Infelizmente, isso pode às vezes significar forçar a consulta atual no primeiro HSTMT a conclusão antes de processar a segunda HSTMTda solicitação.
SQLFreeStmtSQL_CLOSE e SQL_RESET_PARAMS e SQLGetCursorName será chamado durante operações de atualização.
Se houver CLongBinarys na outputColumns, do ODBC DATA_AT_EXEC funcionalidade deve ser suportada.Isso inclui retornando SQL_NEED_DATA de SQLExecDirect, SQLParamData e SQLPutData.
SQLRowCount é chamado depois de executar para verificar apenas 1 registro foi atualizado pela SQLExecDirect.
Cursores ForwardOnly
Somente SQLFetch é necessária para o Mover operações.Observe que forwardOnly cursores não oferecem suporte a atualizações.
Cursores de instantâneo
Funcionalidade de instantâneo requer SQLExtendedFetch suporte.Conforme observado acima, a biblioteca de cursores ODBC detectará quando um driver não oferece suporte a SQLExtendedFetche fornecem o suporte necessário propriamente dito.
SQLGetInfo, SQL_SCROLL_OPTIONS deve oferecer suporte a SQL_SO_STATIC.
Cursores dynaset
A seguir é o suporte mínimo necessário para abrir um dynaset:
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 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.