Esta nota describe las directrices para los escritores de controlador ODBC. Describe requisitos generales y las hipótesis de funcionalidad ODBC que hacen que las clases de base de datos de MFC y diversos detalles semánticos esperados. Se describen la funcionalidad de controlador necesario para soportar los tres modos abierto de CRecordset (forwardOnly, instantánea y dinámico).
Biblioteca de cursores de ODBC
Las clases de base de datos MFC presentan funcionalidad al usuario que en muchos casos supera la funcionalidad proporcionada por la mayoría de los controladores ODBC de nivel 1. Afortunadamente, sí se capa entre el controlador y las clases de base de datos biblioteca de cursores de ODBC y automáticamente proporcionará gran parte de esta funcionalidad adicional.
Por ejemplo, la mayoría de los conductores 1.0 no admiten desplazamiento hacia atrás. La biblioteca de cursores pueden detectarlo, filas desde el controlador de caché y presentarlos como pidió en llamadas FETCH_PREV en SQLExtendedFetch.
Otro ejemplo importante de la dependencia de la biblioteca de cursor está posicionadas actualizaciones. La mayoría de los conductores 1.0 también no tienen actualizaciones con ubicación, pero la biblioteca de cursores generará las instrucciones de actualización que identifican una fila de destino sobre el origen de datos basado en sus valores de datos en memoria caché actual, o un valor de fecha y hora en la memoria caché.
La biblioteca de clases nunca hace uso de varios conjuntos de filas. Por lo tanto, las pocas declaraciones de SQLSetPos siempre se aplican a la fila 1 del conjunto de filas.
CDatabases
Cada CDatabase asigna una sola HDBC. (Si se utiliza la función de función miembro ExecuteSQL de CDatabase, un HSTMT es temporalmente asignada.) Por lo que si se requieren múltiples CDatabase, debe admitirse varios s HDBCpor HENV.
Las clases de base de datos requieren la biblioteca de cursores. Esto se refleja en una llamada SQLSetConnections SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC.
SQLDriverConnect, SQL_DRIVER_COMPLETE usa CDatabase::Open para establecer la conexión con el origen de datos.
El controlador debe admitir SQLGetInfo SQL_ODBC_API_CONFORMANCE gt; = SQL_OAC_LEVEL1, SQLGetInfo SQL_ODBC_SQL_CONFORMANCE > = SQL_OSC_MINIMUM.
A fin de que las transacciones de apoyo para la CDatabase y sus conjuntos de registros dependientes, SQLGetInfo SQL_CURSOR_COMMIT_BEHAVIOR y SQL_CURSOR_ROLLBACK_BEHAVIOR deben tener SQL_CR_PRESERVE. De lo contrario, se omitirán los intentos de realizar control de transacciones.
SQLGetInfo SQL_DATA_SOURCE_READ_ONLY debe ser apoyada. Si devuelve "Y", no las operaciones de actualización se realizará sobre el origen de datos.
Si se abre la CDatabase ReadOnly un intento para establecer el origen de datos de sólo lectura se realizará con SQLSetConnectOption SQL_ACCESS_MODE, SQL_MODE_READ_ONLY.
Si identificadores requieren citando, esta información debe devolverse desde el controlador con una llamadaSQL_IDENTIFIER_QUOTE_CHAR SQLGetInfo .
Para fines de depuración, se recuperan los SQLGetInfo SQL_DBMS_VER y SQL_DBMS_NAME desde el controlador.
SQLSetStmtOption SQL_QUERY_TIMEOUT y SQL_ASYNC_ENABLE pueden denominarse un CDatabasede HDBC.
SQLError puede ser llamado con cualquiera o todos argumentos NULL.
Por supuesto, deben admitirse el SQLAllocEnv, SQLAllocConnect, SQLDisconnect y SQLFreeConnect.
Función miembro ExecuteSQL
En adicional para asignar y liberar un temporal HSTMT, función miembro ExecuteSQL llama SQLExecDirect, SQLFetch, SQLNumResultCol y SQLMoreResults. Puede ser llamado SQLCancel en el HSTMT.
GetDatabaseName
SQLGetInfoSe llamará SQL_DATABASE_NAME .
BeginTrans, CommitTrans, Rollback
SQLSetConnectOptionSe llamará SQL_AUTOCOMMIT y SQLTransactSQL_COMMIT, SQL_ROLLBACK y SQL_AUTOCOMMIT si se solicitan la transacción .
CRecordsets
SQLAllocStmt, SQLFreeStmt , SQLExecDirect (para las operaciones de actualización), SQLPrepare, SQLExecute (para Abrir y Requery) debe ser apoyada. Se llamará SQLNumResultCols y SQLDescribeCol sobre los resultados en diversas ocasiones.
SQLSetParam se utiliza ampliamente para enlace de datos del parámetro y la funcionalidad DATA_AT_EXEC.
SQLBindCol se utiliza ampliamente para registro de salida de ubicaciones de almacenamiento de datos de columna con ODBC.
Dos llamadas de SQLGetData se utilizan para recuperar datos SQL_LONG_VARCHAR y SQL_LONG_VARBINARY . La primera llamada intenta encontrar la longitud total del valor de la columna llamando al SQLGetData con cbMaxValue de 0, pero con una pcbValue válida. Si pcbValue tiene SQL_NO_TOTAL, se produce una excepción. De lo contrario se distribuye entre un HGLOBAL , y otra llamada SQLGetData recuperar todo el resultado.
Actualización
Si se solicita el bloqueo pesimista, SQLGetInfo SQL_LOCK_TYPES que se consultará. Si SQL_LCK_EXCLUSIVE no es compatible, se iniciará una excepción.
Intenta actualizar un CRecordset (instantánea o dynaset) provocará una segunda HSTMT a asignarse. Para los conductores que no admiten la segunda HSTMT, la biblioteca de cursores para simular esta funcionalidad. Por desgracia, a veces esto puede significar forzando la consulta actual en la primera HSTMT hasta su finalización antes de procesar la petición de la segunda HSTMTde s.
SQLFreeStmt SQL_CLOSE y SQL_RESET_PARAMS y SQLGetCursorName se llamará durante las operaciones de actualización.
Si hay CLongBinarys en el outputColumns, la funcionalidad DATA_AT_EXEC de ODBC debe ser apoyada. Esto incluye devolver valor SQL_NEED_DATA de SQLExecDirect, SQLParamData y SQLPutData.
SQLRowCount se llama después de ejecutar para comprobar que sólo 1 registro fue actualizado por el SQLExecDirect.
Cursores ForwardOnly
Sólo SQLFetch es necesario para las operaciones de Mover . Tenga en cuenta que forwardOnly cursores no admiten actualizaciones.
Cursores de instantánea
Funcionalidad instantánea requiere compatibilidad con SQLExtendedFetch . Como se señaló anteriormente, la biblioteca de cursores ODBC detectará cuando un conductor no apoyar SQLExtendedFetchy proporcionar el apoyo necesario sí.
SQLGetInfo, SQL_SCROLL_OPTIONS debe ser compatible con SQL_SO_STATIC.
Cursores Dynaset
A continuación se ofrece el apoyo mínimo requerido para abrir un dinámico:
SQL&GetInfo, SQL_ODBC_VER debe devolver gt; "01".
SQLGetInfo, SQL_SCROLL_OPTIONS debe ser compatible con SQL_SO_KEYSET_DRIVEN.
SQLGetInfo, SQL_ROW_UPDATES debe devolver "Y".
SQLGetInfo, debe admitir SQL_POSITIONED_UPDATES SQL_PS_POSITIONED_DELETE y SQL_PS_POSITIONED_UPDATE.
Además, si se solicita el bloqueo pesimista, una llamada a SQLSetPos con irow 1, fRefresh falso y rebaño SQL_LCK_EXCLUSIVE se realizará.
&Notas técnicas por número |nbsp; Notas técnicas por categoría