Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Observação
A nota técnica a seguir não foi atualizada desde que foi incluída pela primeira vez na documentação on-line. Como resultado, alguns procedimentos e tópicos podem estar desatualizados ou incorretos. Para obter as informações mais recentes, recomenda-se que pesquise o tópico de interesse no índice de documentação online.
Esta nota descreve diretrizes para desenvolvedores de drivers de ODBC. Ele descreve os requisitos gerais e suposições da funcionalidade ODBC que as classes de banco de dados MFC fazem, e vários detalhes semânticos esperados. A funcionalidade de driver necessária para suportar os três CRecordset modos Open (forwardOnly, snapshot 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, excede a funcionalidade fornecida pela maioria dos drivers ODBC de nível 1. Felizmente, a Biblioteca de Cursores do ODBC se sobreporá 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 suporta rolagem para trás. A Biblioteca de Cursores pode detetar isso, armazenando em cache as linhas do driver e apresentando-as conforme solicitado nas chamadas FETCH_PREVSQLExtendedFetch.
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 em cache atuais ou um valor de carimbo de data/hora em cache.
A biblioteca de classes nunca utiliza múltiplos conjuntos de linhas. Portanto, as poucas SQLSetPos declarações são sempre aplicadas à linha 1 do conjunto de linhas.
CDatabases
Cada CDatabase aloca um único HDBC. Se a função CDatabase for usada, um ExecuteSQL será temporariamente alocado. Portanto, se forem necessários vários 's, é necessário suportar vários CDatabases por HENV.
As classes de banco de dados exigem a biblioteca de cursores. Isso se reflete em uma invocação SQLSetConnectionsSQL_ODBC_CURSORS, SQL_CUR_USE_ODBC.
SQLDriverConnect, SQL_DRIVER_COMPLETE é usado por CDatabase::Open para estabelecer a conexão com a fonte de dados.
O driver deve suportar SQLGetInfo SQL_ODBC_API_CONFORMANCE>= SQL_OAC_LEVEL1, SQLGetInfo SQL_ODBC_SQL_CONFORMANCE>= SQL_OSC_MINIMUM.
Para que as transações sejam suportadas para o CDatabase e seus conjuntos de registros dependentes, 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 ser apoiado. Se retornar "Y", nenhuma operação de atualização será executada na fonte de dados.
Se o CDatabase for aberto como ReadOnly, será feita uma tentativa de definir a fonte de dados como somente leitura com SQLSetConnectOption SQL_ACCESS_MODE, SQL_MODE_READ_ONLY.
Se os identificadores exigirem citação, essa informação deve ser retornada do driver com a chamada SQLGetInfo SQL_IDENTIFIER_QUOTE_CHAR.
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 pode ser chamado no CDatabase de HDBC.
SQLError pode ser chamado com qualquer ou todos os argumentos NULL.
Claro que SQLAllocEnv, , SQLAllocConnectSQLDisconnect e SQLFreeConnect tem de ser apoiado.
ExecuteSQL
Além de alocar e liberar um HSTMT temporário, ExecuteSQL chama SQLExecDirect, SQLFetch, SQLNumResultCol e SQLMoreResults.
SQLCancel pode ser invocado no HSTMT.
ObterNomeDoBancoDeDados
SQLGetInfo SQL_DATABASE_NAME será chamado.
IniciarTrans, ConfirmarTrans, Reversão
SQLSetConnectOption SQL_AUTOCOMMIT e SQLTransact SQL_COMMIT, SQL_ROLLBACK e SQL_AUTOCOMMIT serão chamados se forem feitas solicitações de transação.
CRecordsets
SQLAllocStmt, SQLPrepare, SQLExecute (Para Open e Requery), SQLExecDirect (para operações de atualização), SQLFreeStmt deve ser suportado.
SQLNumResultCols e SQLDescribeCol serão invocados os resultados definidos em vários momentos.
SQLSetParam é usado extensivamente para dados de ligação de parâmetros e a funcionalidade de DATA_AT_EXEC.
SQLBindCol é usado extensivamente para registar locais de armazenamento de dados de coluna de saída com ODBC.
Duas SQLGetData chamadas são usadas para recuperar SQL_LONG_VARCHAR e SQL_LONG_VARBINARY dados. A primeira chamada tenta encontrar o comprimento total do valor da coluna ao chamar SQLGetData com um cbMaxValue definido como 0, mas com um pcbValue que é válido. Se pcbValue mantém SQL_NO_TOTAL, uma exceção é lançada. Caso contrário, um HGLOBAL é alocado e outra SQLGetData chamada é feita para recuperar todo o resultado.
Atualização
Se for solicitado um bloqueio pessimista, SQLGetInfo SQL_LOCK_TYPES será consultado. Se SQL_LCK_EXCLUSIVE não for suportado, uma exceção será lançada.
As tentativas de atualizar um CRecordset (snapshot ou dynaset) farão com que um segundo HSTMT seja alocado. Para os drivers que não suportam o segundo HSTMT, a biblioteca de cursores simulará essa funcionalidade. Infelizmente, isso às vezes pode significar forçar a finalização da consulta atual no primeiro HSTMT antes de processar o pedido 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 no outputColumns, a funcionalidade DATA_AT_EXEC do ODBC deve ser suportada. Isso inclui retornar SQL_NEED_DATA de SQLExecDirect, SQLParamData e SQLPutData.
SQLRowCount é chamado depois de executar para verificar se apenas 1 registo foi atualizado pelo SQLExecDirect.
Cursores de Avanço Único
Só SQLFetch é necessário para as Move operações. Observe que os cursores forwardOnly não suportam atualizações.
Cursores de Captura Instantânea
A funcionalidade de snapshot requer o suporte SQLExtendedFetch. Como observado acima, a biblioteca de cursores ODBC detetará quando um driver não suporta SQLExtendedFetche fornecerá o suporte necessário.
SQLGetInfo, SQL_SCROLL_OPTIONS deve apoiar SQL_SO_STATIC.
Cursores 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 apoiar SQL_SO_KEYSET_DRIVEN.
SQLGetInfo, SQL_ROW_UPDATES deve retornar "Y".
SQLGetInfo, SQL_POSITIONED_UPDATES deve apoiar SQL_PS_POSITIONED_DELETE e SQL_PS_POSITIONED_UPDATE.
Além disso, se o bloqueio pessimista for solicitado, será efetuada uma chamada para SQLSetPos com irow 1, fRefresh FALSE e fLock SQL_LCK_EXCLUSIVE.