ODBC: Biblioteca de cursores ODBC
En este tema se describe la biblioteca de cursores ODBC y se explica cómo usarla. Para más información, vea:
La biblioteca de cursores ODBC es una biblioteca de vínculos dinámicos (DLL) que reside entre el Administrador de controladores ODBC y el controlador. En términos de ODBC, un controlador mantiene un cursor para realizar un seguimiento de su posición en el conjunto de registros. El cursor marca la posición del conjunto de registros al que ya se ha desplazado, el registro actual.
Biblioteca de cursores y controladores ODBC de nivel 1
La biblioteca de cursores ODBC proporciona a los controladores de nivel 1 las siguientes funcionalidades nuevas:
Desplazamiento hacia delante y hacia atrás. Los controladores de nivel 2 no necesitan la biblioteca de cursores porque ya se pueden desplazar.
Compatibilidad con instantáneas. La biblioteca de cursores administra un búfer que contiene los registros de la instantánea. Este búfer refleja las eliminaciones y modificaciones del programa en los registros, pero no las adiciones, eliminaciones o modificaciones de otros usuarios. Por lo tanto, la instantánea solo es tan actual como el búfer de la biblioteca de cursores. El búfer tampoco refleja sus propias adiciones hasta que llame a
Requery
. Los conjuntos de registros dinámicos no usan la biblioteca de cursores.
La biblioteca de cursores proporciona instantáneas (cursores estáticos) incluso si el controlador no las admite normalmente. Si el controlador ya admite cursores estáticos, no es necesario cargar la biblioteca de cursores para obtener compatibilidad con instantáneas. Si usa la biblioteca de cursores, únicamente puede usar instantáneas y conjuntos de registros de solo avance. Si el controlador admite conjuntos de registros dinámicos (cursores KEYSET_DRIVEN) y desea usarlos, no debe usar la biblioteca de cursores. Si quiere usar instantáneas y conjuntos de registros dinámicos, debe basarlas en dos objetos CDatabase
diferentes (dos conexiones diferentes), a menos que el controlador admita ambas.
Columnas de actualizaciones posicionadas y marca de tiempo
Nota:
Mediante las clases ODBC de MFC, como se describe en este tema, o las clases DAO de MFC se puede tener acceso a los orígenes de datos ODBC.
Nota:
Si el controlador ODBC admite SQLSetPos
, que MFC usa si está disponible, este tema no se le aplica.
La mayoría de los controladores de nivel 1 no admiten actualizaciones posicionadas. Estos controladores dependen de la biblioteca de cursores para emular las funcionalidades de los controladores de nivel 2 a este respecto. La biblioteca de cursores emula la compatibilidad con actualizaciones posicionadas realizando una actualización buscada en los campos sin cambiar.
En algunos casos, un conjunto de registros puede contener una columna de marca de tiempo como uno de esos campos que no cambian. Surgen dos problemas al usar conjuntos de registros MFC con tablas que contienen columnas de marca de tiempo.
El primer problema se refiere a las instantáneas actualizables en tablas con columnas de marca de tiempo. Si la tabla a la que está enlazada la instantánea contiene una columna de marca de tiempo, debe llamar a Requery
después de llamar a Edit
y Update
. Si no es así, es posible que no pueda volver a editar el mismo registro. Cuando se llama a Edit
y, a continuación Update
, se escribe el registro en el origen de datos y se actualiza la columna de marca de tiempo. Si no llama a Requery
, el valor de marca de tiempo del registro de la instantánea ya no coincide con la marca de tiempo correspondiente en el origen de datos. Al intentar actualizar el registro de nuevo, es posible que el origen de datos no pueda permitir la actualización debido a la falta de coincidencia.
El segundo problema se refiere a las limitaciones de la clase CTime cuando se usa con la función RFX_Date
para transferir información de fecha y hora con una tabla como origen o destino. El procesamiento del objeto CTime
impone cierta sobrecarga en forma de procesamiento intermedio adicional durante la transferencia de datos. El intervalo de fechas de los objetos CTime
también podría ser demasiado limitado para algunas aplicaciones. Una nueva versión de la función RFX_Date
toma un parámetro TIMESTAMP_STRUCT de ODBC en lugar de un objeto CTime
. Para obtener más información, vea RFX_Date
en macros y globales en la referencia de MFC.
Uso de la biblioteca de cursores
Cuando se conecta a un origen de datos —llamando a CDatabase::OpenEx o CDatabase::Open— se puede especificar si se va a utilizar la biblioteca del cursor para el origen de datos. Si va a crear instantáneas en ese origen de datos, especifique la opción CDatabase::useCursorLib
en el parámetro dwOptions
en OpenEx
o especifique TRUE para el parámetro bUseCursorLib en Open
(el valor predeterminado es TRUE). Si el controlador ODBC admite conjuntos de registros dinámicos y desea abrir tales conjuntos en el origen de datos, no use la biblioteca de cursores (enmascara alguna funcionalidad de controlador necesaria para los conjuntos de registros dinámicos). En ese caso, no especifique CDatabase::useCursorLib
en OpenEx
ni especifique FALSE para el parámetro bUseCursorLib en Open
.