Conjunto de registros dinámicos
En este tema se describen los conjuntos dinámicos y se analiza su disponibilidad.
Nota:
Este tema es aplicable a las clases ODBC de MFC, como CRecordset. Para información sobre los conjuntos dinámicos de las clases DAO, consulte CDaoRecordset. Con DAO, puede abrir conjuntos de registros de tipo conjunto dinámico.
Un conjunto dinámico es un conjunto de registros con propiedades dinámicas. Mientras dura, un objeto recordset en modo dynaset (normalmente denominado conjunto dinámico) permanece sincronizado con el origen de datos de la siguiente manera. En un entorno multiusuario, otros usuarios pueden editar o eliminar registros que se encuentran en el conjunto dinámico o agregar registros a la tabla que representa el conjunto dinámico. Los registros que la aplicación agrega o elimina del conjunto de registros se reflejan en el conjunto dinámico. Los registros que otros usuarios agregan a la tabla no se reflejarán en el conjunto dinámico hasta que lo recompile llamando a su función miembro Requery
. Cuando otros usuarios eliminan registros, el código MFC omite las eliminaciones del conjunto de registros. Los cambios de edición de otros usuarios en los registros existentes se reflejan en el conjunto dinámico en cuanto se desplaza al registro afectado.
De igual forma, las modificaciones que realice en los registros de un conjunto dinámico se reflejan en los conjuntos dinámicos usados por otros usuarios. Los registros que agregue no se reflejan en los conjuntos dinámicos de otros usuarios hasta que vuelven a consultar sus conjuntos dinámicos. Los registros que elimine se marcan como "eliminados" en los conjuntos de registros de otros usuarios. Si tiene varias conexiones a la misma base de datos (varios objetos CDatabase
), los conjuntos de registros asociados a esas conexiones tienen el mismo estado que los conjuntos de registros de otros usuarios.
Los conjuntos dinámicos son más valiosos cuando los datos deben ser dinámicos, como (por ejemplo) en un sistema de reserva de vuelos.
Nota:
Para usar conjuntos dinámicos, debe tener un controlador ODBC para el origen de datos que admita conjuntos dinámicos y la biblioteca de cursores ODBC no debe estar cargada. Para más información, consulte Disponibilidad de conjuntos dinámicos.
Para especificar que un conjunto de registros es un conjunto dinámico, pase CRecordset::dynaset
como primer parámetro a la función miembro Open
del objeto recordset.
Nota:
Para los conjuntos dinámicos actualizables, el controlador ODBC debe admitir instrucciones de actualización posicionadas o la función de API ODBC ::SQLSetPos
. Si se admiten ambos, MFC usa ::SQLSetPos
para lograr más eficacia.
Disponibilidad de conjuntos dinámicos
Las clases de base de datos MFC admiten conjuntos dinámicos si se cumplen los siguientes requisitos:
El archivo DLL de la biblioteca de cursores ODBC no debe estar en uso con este origen de datos.
Si se usa la biblioteca de cursores, enmascara alguna funcionalidad del controlador ODBC subyacente que es necesaria para la compatibilidad con los conjuntos dinámicos. Si quiere usar conjuntos dinámicos (y el controlador ODBC tiene la funcionalidad necesaria para los conjuntos dinámicos, como se describe en el resto de esta sección), puede hacer que MFC no cargue la biblioteca de cursores al crear un objeto
CDatabase
. Para más información, consulte ODBC y la función miembro OpenEx o Open de la claseCDatabase
.En la terminología de ODBC, tanto los conjunto de registros dinámicos como las instantáneas se conocen como cursores. Un cursor es un mecanismo que se usa para realizar un seguimiento de su posición en un conjunto de registros.
El controlador ODBC del origen de datos debe admitir cursores controlados por conjuntos de claves.
Los cursores controlados por conjuntos de claves administran los datos de una tabla mediante la obtención y el almacenamiento de un conjunto de claves. Las claves se usan para obtener los datos actuales de la tabla cuando el usuario se desplaza a un registro determinado. Para determinar si el controlador proporciona esta compatibilidad, llame a la función de API ODBC
::SQLGetInfo
con el parámetro SQL_SCROLL_OPTIONS.Si intenta abrir un conjunto dinámico sin compatibilidad con conjuntos de claves, recibirá una excepción
CDBException
con el valor de código devuelto AFX_SQL_ERROR_DYNASET_NOT_SUPPORTED.El controlador ODBC del origen de datos debe admitir la captura extendida.
La captura extendida es la capacidad de desplazarse hacia atrás, así como hacia delante por los registros resultantes de la consulta SQL. Para determinar si el controlador admite esta capacidad, llame a la función de API ODBC
::SQLGetFunctions
con el parámetro SQL_API_SQLEXTENDEDFETCH.
Si quiere conjuntos dinámicos que se puedan actualizar (o instantáneas, para el caso), el controlador ODBC también debe admitir la función de API ODBC ::SQLSetPos
o actualizaciones posicionadas. La función ::SQLSetPos
permite a MFC actualizar el origen de datos sin enviar instrucciones SQL. Si esta compatibilidad está disponible, MFC la usa de forma preferente a la realización de actualizaciones mediante SQL. Para determinar si el controlador admite ::SQLSetPos
, llame a ::SQLGetInfo
con el parámetro SQL_POS_OPERATIONS.
Las actualizaciones posicionadas usan sintaxis SQL (con el formato WHERE CURRENT OF<cursorname>) para identificar una fila determinada de la tabla del origen de datos. Para determinar si el controlador admite actualizaciones posicionadas, llame a ::SQLGetInfo
con el parámetro SQL_POSITIONED_STATEMENTS.
Por lo general, los conjuntos dinámicos de MFC (pero no los conjuntos de registros de solo avance) requieren un controlador ODBC que guarde conformidad con la API de nivel 2. Si el controlador del origen de datos se ajusta al conjunto de API de nivel 1, puede seguir usando instantáneas actualizables y de solo lectura y conjuntos de registros de solo avance, pero no conjuntos dinámicos. Sin embargo, un controlador de nivel 1 puede admitir conjuntos dinámicos si admite la captura extendida y los cursores basados en conjuntos de claves. Para más información sobre los niveles de conformidad de ODBC, consulte ODBC.
Nota:
Si quiere usar instantáneas y conjuntos de registros dinámicos, debe basarlas en dos objetos CDatabase
diferentes (dos conexiones diferentes).
A diferencia de las instantáneas, que usan almacenamiento intermedio mantenido por la biblioteca de cursores de ODBC, los conjuntos dinámicos capturan un registro directamente del origen de datos en cuanto el usuario se desplaza hacia él. De esta forma, los registros seleccionados originalmente por el conjunto dinámico se mantienen sincronizado con el origen de datos.
Vea Lista de controladores ODBC para obtener una lista de los controladores ODBC incluidos en esta versión de Visual C++ e información sobre cómo obtener controladores adicionales.