TN053: Costumbre DFX rutinas para las clases de base de datos DAO

Esta nota técnica describe el mecanismo de intercambio (DFX) de campos de registros de DAO. Para ayudar a comprender lo que está sucediendo en las rutinas DFX, la función DFX_Text se explicará en detalle como un ejemplo. Como una fuente adicional de información para esta nota técnica, puede simplemente examinar el código para el otro las funciones individuales de DFX.Probablemente no necesitará una rutina personalizada de DFX tan a menudo como es posible que necesite una rutina personalizada de RFX (utilizada con clases de base de datos ODBC).

Esta nota técnica contiene:

Visión general DFX

El mecanismo de intercambio de campos de registros DAO (DFX) se utiliza para simplificar el procedimiento de recuperación y actualización de datos al utilizar la clase CDaoRecordset . El proceso se simplifica mediante el uso de miembros de datos de la clase CDaoRecordset . Derivando de CDaoRecordset, puede agregar a miembros de datos a la clase derivada que representa cada campo en una tabla o consulta. Este mecanismo de "enlace estática" es simple, pero puede que no sea el método de obtención y actualización de datos de elección para todas las aplicaciones. DFX recupera cada campo enlazado cada vez que se cambia el registro actual. Si está desarrollando una aplicación de rendimiento sensibles que no requiere la obtención de cada campo cuando se cambia moneda, "dinámica vinculante" a través de CDaoRecordset::GetFieldValue y CDaoRecordset::SetFieldValue puede ser el método de elección de acceso a los datos.

&Notanbsp;  DFX y enlace dinámico no son mutuamente excluyentes, por lo que puede utilizarse un uso híbrido de enlace estático y dinámico.

Ejemplo 1 - uso de intercambio de campos de registros DAO sólo

(se supone CDaoRecordset - clase derivada CMySet ya abierto)

/ / Agregar un nuevo registro a la tabla customers
MYSET.AddNew();
MYSET.m_strCustID = _T("MSFT");
MYSET.m_strCustName = _T("Microsoft");
MYSET.Actualizar()

Ejemplo 2 - uso de enlace dinámico sólo

(se supone utilizando la clase CDaoRecordset , rs , y ya está abierto)

/ / Agregar un nuevo registro a la tabla customers
COleVariantnbsp; varFieldValue1 (_T("MSFT"), VT_BSTRT);
/ / &Nota: VT_BSTRT banderas tipo string como ANSI, en lugar del predeterminado UNICODE
COleVariant varFieldValue2 (_T("Microsoft"), VT_BSTRT);
RS.AddNew();
RS.SetFieldValue(_T("Customer_ID"), varFieldValue1);
RS.SetFieldValue(_T("Customer_Name"), varFieldValue2);
RS.Actualizar()

Ejemplo 3 - uso de intercambio de campos de registros de DAO y enlace dinámico

(asume datos de navegación empleado con CDaoRecordset-clase derivada de emp )

/ / Obtener datos del empleado, por lo que se puede mostrar
EMP.MoveNext();

Y si el usuario desea ver la fotografía del empleado,
/ / obtenerlo
COleVariant varPhoto;
Si (bSeePicture)
EMP.GetFieldValue(_T("photo"), varPhoto);

/ / Mostrar los datos
PopUpEmployeeData (emp.m_strFirstName,
 EMP.m_strLastName, varPhoto)

Cómo funciona DFX

El mecanismo DFX funciona de manera similar al mecanismo de intercambio (RFX) de campo de registro utilizada por las clases ODBC de MFC. Los principios de DFX y RFX son los mismos pero hay numerosas diferencias internas. El diseño de las funciones DFX era tal que prácticamente todo el código es compartido por las rutinas individuales de DFX. En el más alto nivel DFX sólo hace un par de cosas.

En el corazón de la DFX mecanismo es función de la clase CDaoRecordset derivada DoFieldExchange . Esta función envía llamadas a las funciones DFX individuales de un tipo de operación correspondiente. Antes de llamar a DoFieldExchange MFC interna funciones definir el tipo de operación. La siguiente lista muestra los distintos tipos de operación y una breve descripción.

Operación Descripción
AddToParameterList Construye cláusula de parámetros
AddToSelectList Cláusula SELECT se basa
BindField Establece una estructura de enlace
BindParam Establece los valores de parámetro
Reparación Establece el estado NULL
AllocCache Asigna memoria caché para verificación sucio
StoreField Guarda el registro actual en la memoria caché
LoadField Caché restaura los valores de miembros
FreeCache Libera memoria caché
SetFieldNull Conjuntos de c&o amp de Estado; valor NULL
MarkForAddNew Marca campos sucios si no PSEUDO NULL
MarkForEdit Si sucio de campos de marcas no coinciden con caché
SetDirtyField Conjuntos de campo valores marcados como sucios

En la siguiente sección, cada operación se explicará más detalladamente para DFX_Text.

La característica más importante para comprender acerca del proceso de intercambio de campos de registros DAO es que utiliza la función de GetRows del objeto ICDaoRecordset . La función DAO GetRows puede trabajar de varias maneras. Esta nota técnica describe brevemente GetRows como está fuera del alcance de esta nota técnica.

DAO GetRows puede trabajar de varias maneras.

Lo que hace su rutina DFX personalizado

Es evidente a partir de este debate que la operación más importante en cualquier función DFX debe ser la capacidad de configurar las estructuras de datos necesarios correctamente llamar GetRows. Hay un número de otras operaciones que debe admitir como una función DFX, pero ninguno tan importante ni complejos como preparar correctamente el GetRows llamar.

El uso de DFX se describe en la documentación en línea. Básicamente, hay 2 requisitos. En primer lugar, los miembros deben agregarse a la clase CDaoRecordset derivada para cada parámetro y campo enlazado. Tras este CDaoRecordset::DoFieldExchange deben reemplazarse. Tenga en cuenta que el tipo de datos del miembro es importante. Deben coincidir con los datos del campo de la base de datos o al menos ser convertable a ese tipo. Por ejemplo, un campo numérico de base de datos, tales como un entero largo, puede convertir a texto y enlazado a un miembro de CString siempre, pero un campo de texto en una base de datos no necesariamente se convierten en una representación numérica, tales como un entero largo y enlazado a un miembro de un entero largo. DAO y el motor de base de datos de Microsoft Jet son responsables de la conversión (en lugar de MFC).

Detalles de DFX_Text

Como se mencionó anteriormente, probablemente la mejor manera de explicar cómo funciona DFX es simplemente trabajar a través de un ejemplo. Para este propósito pasando por la parte interna de DFX_Text debería funcionar bien para ayudar a proporcionar al menos una comprensión básica de DFX.

AddToParameterList

Esta operación basa en la cláusula SQL parámetros (" Parameters lt;param name>, <param type> ... ; ") requeridos por Jet. Cada parámetro es llamado y escrito (como se especifica en la llamada RFX). Ver la función CDaoFieldExchange::AppendParamType función para ver los nombres de los tipos individuales. En el caso de DFX_Text, es el tipo usadotext.

AddToSelectList

Construye la cláusula SQL que Seleccione . Esto es bastante sencillo como el nombre de columna especificado por la llamada DFX es simplemente anexa (" SELECT lt;column name>, ... ").

BindField

-Por mucho la más compleja de las operaciones. Como se mencionó anteriormente que esta es donde se configura la estructura de enlace de DAO utilizada GetRows . Como se puede ver desde el código en DFX_Text los tipos de información en la estructura incluyen el tipo DAO utilizado (DAO_CHAR o DAO_WCHAR en el caso de DFX_Text). Además, el tipo de enlace utilizado es también configurar. En una sección anterior GetRows fue descrita brevemente, pero fue suficiente para explicar que el tipo de enlace utilizado por MFC siempre es vinculante de dirección directa (DAOBINDING_DIRECT). Además para el enlace de columna de longitud variable (como DFX_Text) enlace de devolución de llamada se utiliza para que pueda controlar la asignación de memoria y especificar una dirección de la longitud correcta MFC. Lo que esto significa es MFC puede siempre contar DAO "donde" poner los datos, permitiendo el enlace directamente a variables miembro. El resto de la estructura de enlace se rellena con cosas como la dirección de la función de devolución de llamada de asignación de memoria y el tipo de enlace de columna (vinculantes en nombre de la columna).

BindParam

Esta es una operación sencilla que se llama SetParamValue con el valor del parámetro especificado en su miembro de parámetro.

Reparación

Rellena el estado NULL para cada campo.

SetFieldNull

Esta operación sólo marca cada condición de campo NULL y establece al miembro del valor de la variable PSEUDO_NULL.

SetDirtyField

Llamadas SetFieldValue para cada campo marcado sucio.

Todas las restantes operaciones de tratan sólo con el uso de la caché de datos. La caché de datos es un búfer adicional de los datos del registro actual que se utiliza para hacer ciertas cosas más simples. Por ejemplo pueden detectarse automáticamente campos "sucios". Como se describe en la documentación en línea se puede desactivar completamente o a nivel del terreno. La aplicación del búfer utiliza un mapa. Este mapa se utiliza para hacer coincidir asignados dinámicamente copias de los datos con la dirección del campo "dependiente" (o miembro de datos de derieved de CDaoRecordset ).

AllocCache

Dinámicamente asigna el valor del campo en la memoria caché y lo agrega al mapa.

FreeCache

Elimina el valor del campo en caché y elimina del mapa.

StoreField

Copia el valor del campo actual en la caché de datos.

LoadField

Copia el valor almacenado en caché en el miembro de campo.

MarkForAddNew

Comprueba si el valor del campo actual es no-NULL y marcas sucio si es necesario.

MarkForEdit

Compara el valor actual del campo con memoria caché de datos y marca sucia si es necesario.

Sugere&ncianbsp;  Modelo de las rutinas de DFX personalizadas en las rutinas DFX existentes para tipos de datos estándar.

&Notas técnicas por número |nbsp; Notas técnicas por categoría

Index