Intercambio de campos de registros: Funcionamiento de RFX

En este tema se explica el proceso RFX. Este es un tema avanzado que abarca:

Nota:

Este tema se aplica a clases derivadas de CRecordset donde no se haya implementado la obtención masiva de filas. Si usa la obtención masiva de filas, se implementará el intercambio masivo de campos de registros (RFX masivo). RFX masivo es similar a RFX. Para comprender las diferencias, vea Conjunto de registros: Captura de registros en bloque (ODBC).

RFX y conjunto de registros

Los miembros de datos de campo del objeto del conjunto de registros, tomados juntos, constituyen un búfer de edición que contiene las columnas seleccionadas de un registro. Cuando el conjunto de registros se abre por primera vez y está a punto de leer el primer registro, RFX enlaza (asocia) cada columna seleccionada a la dirección del miembro de datos de campo adecuado. Cuando el conjunto de registros actualiza un registro, RFX llama a las funciones de la API ODBC para enviar una instrucción UPDATE o INSERT de SQL al controlador. RFX usa su conocimiento de los miembros de datos de campo para especificar las columnas que se van a escribir.

El marco realiza una copia de seguridad del búfer de edición en determinadas fases para que pueda restaurar su contenido si es necesario. RFX realiza una copia de seguridad del búfer de edición antes de agregar un nuevo registro y antes de editar un registro existente. Restaura el búfer de edición en algunos casos, por ejemplo, después de una llamada a Update después de AddNew. El búfer de edición no se restaura si abandona un búfer de edición recién cambiado, por ejemplo, pasando a otro registro antes de llamar a Update.

Además de intercambiar datos entre el origen de datos y los miembros de datos de campo del conjunto de registros, RFX administra los parámetros de enlace. Cuando se abre el conjunto de registros, los miembros de datos de parámetro se enlazan en el orden de los marcadores de posición "?" de la instrucción SQL que CRecordset::Open construye. Para más información, vea Conjunto de registros: Parametrizar un conjunto de registros (ODBC).

La invalidación de la clase del conjunto de registros de DoFieldExchange realiza todo el trabajo, moviendo los datos en ambas direcciones. Al igual que el intercambio de datos de cuadro de diálogo (DDX), RFX necesita información sobre los miembros de datos de la clase. El Asistente proporciona la información necesaria escribiendo una implementación específica del conjunto de registros de DoFieldExchange de manera automática, en función de los nombres de miembros de datos de campo y los tipos de datos que especifique con el Asistente.

Proceso de intercambio de campos de registros (RFX)

En esta sección se describe la secuencia de eventos RFX a medida que se abre un objeto de conjunto de registros y a medida que se agregan, actualizan y eliminan registros. La tabla Secuencia de operaciones de RFX durante la apertura del conjunto de registros y la tabla Secuencia de operaciones de RFX durante el desplazamiento de este tema muestran el proceso mientras RFX procesa un comando Move en el conjunto de registros y mientras RFX administra una actualización. Durante estos procesos, se llama a DoFieldExchange para realizar muchas operaciones diferentes. El miembro de datos m_nOperation del objeto CFieldExchange determina qué operación se solicita. Es posible que le resulte útil leer Conjunto de registros: Cómo se seleccionan los registros (ODBC) y Conjunto de registros: Actualizar los registros (ODBC) antes de leer este material.

RFX: Enlace inicial de columnas y parámetros

Se producen las siguientes actividades RFX, en el orden mostrado, cuando se llama a la función miembro Open de un objeto de conjunto de registros:

  • Si el conjunto de registros tiene miembros de datos de parámetros, el marco llama DoFieldExchange a para enlazar los parámetros a marcadores de posición de parámetros en la cadena de instrucción SQL del conjunto de registros. Se usa una representación dependiente del tipo de datos del valor del parámetro para cada marcador de posición que se encuentra en la instrucción SELECT. Esto ocurre después de preparar la instrucción SQL, pero antes de que se ejecute. Para obtener información sobre la preparación de instrucciones, vea la función ::SQLPrepare en la Referencia del programador de ODBC.

  • El marco llama a DoFieldExchange una segunda vez para enlazar los valores de las columnas seleccionadas a los miembros de datos de campo correspondientes del conjunto de registros. Esto establece el objeto del conjunto de registros como un búfer de edición que contiene las columnas del primer registro.

  • El conjunto de registros ejecuta la instrucción SQL y el origen de datos selecciona el primer registro. Las columnas del registro se cargan en los miembros de datos de campo del conjunto de registros.

En la tabla siguiente se muestra la secuencia de operaciones de RFX al abrir un conjunto de registros.

Secuencia de operaciones de RFX durante la apertura del conjunto de registros

La operación Operación DoFieldExchange Operación de base de datos/SQL
1. Abra el conjunto de registros.
2. Compile una instrucción SQL.
3. Envíe el SQL.
4. Enlace miembros de datos de parámetros.
5. Enlace miembros de datos de campo a columnas.
6. ODBC mueve y rellena los datos.
7. Corrija los datos de C++.

Los conjuntos de registros usan la ejecución preparada de ODBC para permitir una nueva consulta rápida con la misma instrucción SQL. Para obtener más información sobre la ejecución preparada, vea la Referencia del programador de ODBC.

RFX: Desplazamiento

Cuando se desplaza de un registro a otro, el marco llama a DoFieldExchange para reemplazar los valores almacenados anteriormente en los miembros de datos de campo por valores para el nuevo registro.

En la tabla siguiente se muestra la secuencia de operaciones de RFX cuando el usuario pasa de un registro a otro.

Secuencia de operaciones de RFX durante el desplazamiento

La operación Operación DoFieldExchange Operación de base de datos/SQL
1. Llame a MoveNext o a una de las otras funciones Move.
2. ODBC mueve y rellena los datos.
3. Corrija los datos de C++.

RFX: Agregar nuevos registros y editar registros existentes

Si agrega un nuevo registro, el conjunto de registros funciona como un búfer de edición para generar el contenido del nuevo registro. Al igual que con la adición de registros, la edición de registros implica cambiar los valores de los miembros de datos de campo del conjunto de registros. Desde la perspectiva de RFX, la secuencia es la siguiente:

  1. La llamada a la función miembro AddNew o Edit del conjunto de registros hace que RFX almacene el búfer de edición actual para que se pueda restaurar más adelante.

  2. AddNew o Edit prepara los campos en el búfer de edición para que RFX pueda detectar miembros de datos de campo modificados.

    Dado que un nuevo registro no tiene valores anteriores con los que comparar los nuevos, AddNew establece el valor de cada miembro de datos de campo en un valor de PSEUDO_NULL. Más adelante, cuando se llama a Update, RFX compara el valor de cada miembro de datos con el valor de PSEUDO_NULL. Si hay una diferencia, se ha establecido el miembro de datos. (PSEUDO_NULL no es igual que una columna de registro con un valor Null verdadero ni tampoco es igual que el valor NULL de C++).

    A diferencia de la llamada Update para AddNew, la llamada Update para Edit compara los valores actualizados con valores almacenados anteriormente en lugar de usar PSEUDO_NULL. La diferencia es que AddNew no tiene valores almacenados previamente para la comparación.

  3. Establece directamente los valores de los miembros de los datos de campo cuyos valores desea editar o que desea rellenar para un nuevo registro. Esto puede incluir la llamada a SetFieldNull.

  4. La llamada a Update comprueba si hay miembros de datos de campo modificados, como se describe en el paso 2 (consulte la tabla Secuencia de operaciones de RFX durante el desplazamiento). Si no ha cambiado ninguno, Update devuelve 0. Si algunos miembros de datos de campo han cambiado, Update prepara y ejecuta una instrucción SQL INSERT que contiene valores para todos los campos actualizados del registro.

  5. Para AddNew, Update concluye restaurando los valores almacenados anteriormente del registro actual antes de la llamada AddNew. Para Edit, los valores modificados nuevos permanecen en su lugar.

En la tabla siguiente se muestra la secuencia de operaciones de RFX al agregar un nuevo registro o editar un registro existente.

Secuencia de operaciones RFX durante AddNew y Edit

La operación Operación DoFieldExchange Operación de base de datos/SQL
1. Llame a AddNew o Edit.
2. Haga una copia de seguridad del búfer de edición.
3. Para AddNew, marque los miembros de datos de campo como "clean" y Null.
4. Asigne valores a los miembros de datos de campo del conjunto de registros.
5. Llame a Update.
6. Compruebe si hay campos modificados.
7. Compile la instrucción INSERT de SQL para AddNew o la instrucción UPDATE para Edit.
8. Envíe el SQL.
9. Para AddNew, restaure el búfer de edición en su contenido de copia de seguridad. Para Edit, elimine la copia de seguridad.

RFX: Eliminación de registros existentes

Al eliminar un registro, RFX establece todos los campos en NULL como recordatorio de que el registro se ha eliminado y debe desactivarlo. No necesita ninguna otra información de secuencia RFX.

Consulte también

Intercambio de campos de registros (RFX)
Consumidor ODBC MFC
Macros, funciones globales y variables globales
CFieldExchange (clase)
CRecordset::DoFieldExchange