Compartilhar via


TN042: recomendações do desenvolvedor de driver ODBC

Dica

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

Essa observação descreve diretrizes para gravadores de driver ODBC. Descreve requisitos gerais e suposições da funcionalidade do ODBC que as classes da base de dados de MFC ocorrer, e vários detalhes semânticos esperados. A funcionalidade necessária do driver para dar suporte a três modos abertos de CRecordset (forwardOnly, snapshot e dynaset) é descrita.

A biblioteca de cursores ODBC

O base de dados de MFC classifica a funcionalidade atual ao usuário que ultrapassa em muitos casos a funcionalidade fornecida pela maioria dos drivers ODBC de nível 1. Felizmente, a biblioteca de cursores ODBC mergulhar-se-á entre as classes da base de dados e o driver, e fornecer-se-&z automaticamente grande parte dessa funcionalidade adicional.

Por exemplo, a maioria 1,0 motoristas não dão suporte à rolagem para trás. A biblioteca de cursores pode detectar essa, e armazenará em cachê linhas do driver e apresentá-las-á como solicitado em chamadas de FETCH_PREV em SQLExtendedFetch.

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

A biblioteca de classes nunca utiliza vários conjuntos de linhas. Em virtude disso, algumas instruções de SQLSetPos são aplicadas sempre 1 para enfileirar do conjunto de linhas.

CDatabases

Cada CDatabase atribui único HDBC. (Se a função de CDatabaseExecuteSQL é usada, HSTMT é atribuído temporariamente.) Portanto, se vários CDatabases forem necessários, vários HDBCs por HENV devem ter suporte.

As classes da base de dados requerem a biblioteca de cursores. Isso é refletido em uma chamada SQL_ODBC_CURSORSde SQLSetConnections , 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 oferecer suporte SQLGetInfo SQL_ODBC_API_CONFORMANCE >= SQL_OAC_LEVEL1, SQLGetInfo SQL_ODBC_SQL_CONFORMANCE >= SQL_OSC_MINIMUM.

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

SQLGetInfo SQL_DATA_SOURCE_READ_ONLY deve ser suporte. Se retornar “Y”, nenhuma operação de atualização é executada na fonte de dados.

Se CDatabase é readonly aberto, uma tentativa de definir a fonte de dados somente leitura será feita com SQLSetConnectOption SQL_ACCESS_MODE, SQL_MODE_READ_ONLY.

Se os identificadores exigem a citação, essas informações devem ser retornadas do driver com uma chamada de SQLGetInfoSQL_IDENTIFIER_QUOTE_CHAR .

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

SQLSetStmtOption SQL_QUERY_TIMEOUT e SQL_ASYNC_ENABLE podem ser chamados CDatabaseHDBC.

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

Naturalmente, SQLAllocEnv, SQLAllocConnect, SQLDisconnect e SQLFreeConnect serão suportados.

ExecuteSQL

Além da alocação e a liberação de HSTMTtemporário, ExecuteSQL chama SQLExecDirect, SQLFetch, SQLNumResultCol e SQLMoreResults. SQLCancel pode ser chamado HSTMT.

GetDatabaseName

SQLGetInfo SQL_DATABASE_NAME será chamado.

BeginTrans, CommitTrans, reversão

SQLSetConnectOption SQL_AUTOCOMMIT e SQLTransact SQL_COMMIT, SQL_ROLLBACK e SQL_AUTOCOMMIT serão destacados se as solicitações de transação são feitas.

CRecordsets

SQLAllocStmt, SQLPrepare, SQLExecute (para Abrir e Requery), SQLExecDirect (para operações de atualização), SQLFreeStmt deve ser suporte. SQLNumResultCols e SQLDescribeCol serão chamados os resultados diversas vezes.

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

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

Duas chamadas de SQLGetData são usados para recuperar dados de SQL_LONG_VARCHAR e de SQL_LONG_VARBINARY . As tentativas da primeira chamada de localizar o comprimento total do valor da coluna SQLGetData chamando com cbMaxValue de 0, mas com um pcbValue válido. Se o pcbValue contém SQL_NO_TOTAL, uma exceção será lançada. Caso contrário, HGLOBAL é atribuído, e outra chamada de SQLGetData é feito para recuperar o resultado inteiro.

Atualizando

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

As tentativas de atualização CRecordset (snapshot ou dynaset) causará um segundo HSTMT a ser atribuído. Para drivers que não dão suporte a HSTMT, dependendo da biblioteca de cursores simulará essa funcionalidade. Infelizmente, isso às vezes pode significar forçar a consulta atual em primeiro HSTMT até a conclusão antes de processar a segunda solicitação de HSTMT .

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

Se houver CLongBinarys em outputColumns, a funcionalidade de DATA_AT_EXEC ODBC deve haver suporte. Isso inclui retornar SQL_NEED_DATA de SQLExecDirect, de SQLParamData e de SQLPutData.

SQLRowCount é chamado depois execute para verificar se somente 1 registro seja atualizado por SQLExecDirect.

Cursores de ForwardOnly

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

Cursores de instantâneo

A funcionalidade de instantâneo requer suporte de SQLExtendedFetch . Como observado anteriormente, a biblioteca de cursores detectará quando um driver não oferece suporte SQLExtendedFetch, e fornece suporte necessário próprio ODBC.

SQLGetInfo, SQL_SCROLL_OPTIONS deve oferecer suporte SQL_SO_STATIC.

Cursores de Dynaset

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

SQLGetInfo, SQL_ODBC_VER deve retornar > “01 ".

SQLGetInfo, SQL_SCROLL_OPTIONS deve oferecer suporte SQL_SO_KEYSET_DRIVEN.

SQLGetInfo, SQL_ROW_UPDATES deve retornar “Y”.

SQLGetInfo, SQL_POSITIONED_UPDATES deve oferecer suporte SQL_PS_POSITIONED_DELETE e SQL_PS_POSITIONED_UPDATE.

Além disso, se o bloqueio pessimista é solicitado, uma chamada para irow SQLSetPos com 1, fRefresh FALSE e rebanho SQL_LCK_EXCLUSIVE será feito.

Consulte também

Outros recursos

Observações técnicas por número

Observações técnicas por categoria