Esta nota describe la arquitectura de exchange (RFX) de campo de registro. También se describe cómo escribir un procedimiento RFX_.
Visión general de intercambio de campos de registro
Todas las funciones de campo de juego de registros se realizan con código de C++. No hay recursos especiales o macros de magia. El corazón del mecanismo es una función virtual que debe reemplazarse en cada clase recordset derivadas. Siempre se encuentra en este formulario:
void CMySet::DoFieldExchange (CFieldExchange * pFX)
{
//{{AFX_FIELD_MAP(CMySet)
lt; recordset intercambio campo tipo llamada >
< llamada de función de intercambio de registros >
//}}AFX_FIELD_MAP
}
Los comentarios AFX formato especial permiten ClassWizard localizar y editar el código dentro de esta función. Código que no es compatible con ClassWizard debe colocarse fuera de las observaciones de formato especial.
En el ejemplo anterior, lt; recordset_exchange_field_type_call > en forma:
pFX->SetFieldType(CFieldExchange::outputColumn)
y lt; recordset_exchange_function_call > en forma:
RFX_Custom (pFX, "Col2", m_Col2)
La mayoría de RFX_ de funciones tienen tres argumentos como se muestra arriba, pero algunos (por ejemplo, RFX_Text y RFX_Binary) tienen argumentos opcionales adicionales.
Más de un RFX_ pueden incluirse en cada función DoDataExchange.
Ver 'afxdb.h' para obtener una lista de todos las registros intercambio rutinas de campo provisto de MFC.
Llamadas del campo de juego de registros son una forma de registro de ubicaciones de memoria (por lo general miembros de datos) para almacenar los datos de campo para una clase de CMySet.
Notas
Funciones del campo de juego de registros están diseñadas para funcionar sólo con las clases CRecordset . No son generalmente utilizables por cualquier otras clases MFC.
Los valores iniciales de datos se establecen en el constructor de C++ estándar, normalmente en un bloque con //{{AFX_FIELD_INIT(CMylSet) y //}}AFX_FIELD_INIT comentarios.
Cada función RFX_ debe admitir varias operaciones, que van desde volver el estado sucio del campo para el campo de preparación para la edición del campo de archiving.
Cada función que llama a DoFieldExchange (por ejemplo, SetFieldNull, IsFieldDirty), propia inicialización alrededor de la llamada a DoFieldExchange.
¿Cómo funciona?
No es necesario comprender lo siguiente para poder utilizar campo de registro de exchange. Sin embargo, entender cómo funciona detrás de las escenas le ayudará a escribir su propio procedimiento de intercambio.
La función miembro DoFieldExchange es muy parecida a la función de miembro Serialize - es responsable de obtener o establecer datos/a datos de los miembros de la clase de forma externa (en este caso las columnas del resultado de una consulta ODBC). El parámetro pFX es el contexto para realizar el intercambio de datos y es similar al parámetro CArchive a CObject::Serialize. Los pFX (un objeto CFieldExchange ) tiene un indicador de la operación, que es similar a pero una generalización de la dirección de CArchive bandera. Puede tener una función RFX apoyar las operaciones siguientes
Extensiones de usuario
Hay varias maneras de ampliar el mecanismo predeterminado de RFX. Puedes
CBookmark
void AFXAPI RFX_Bigint(CFieldExchange* pFX, const char *szName,
nbsp; BIGINT & valor)
mientras (posExtraFields! = &NULL)
{
nbsp; RFX_Text (pFX, m_listName.GetNext(posExtraFields), m_listValue.GetNext(posExtraValues));
}
&Notanbsp; Ese código no puede ser editado por ClassWizard y debe utilizarse sólo fuera de los comentarios de formato especial.
Escribir una costumbre RFX
Para escribir su propia función personalizada RFX, se sugiere que copiar una función RFX existente y modificarlo para sus propios fines. La derecha RFX para copiar la selección puede hacer su trabajo mucho más fácil. Algunas funciones RFX tienen algunas propiedades únicas que se deben tener en cuenta al decidir que copiar.
RFX_Long y RFX_Int:
Estas son las más simples funciones de RFX. El valor de los datos no necesita ninguna interpretación especial, y se fija el tamaño de los datos.
RFX_Single y RFX_Double:
Como RFX_Long y RFX_Int arriba, estas funciones son simples y pueden hacer uso extensamente de la implementación predeterminada. Se almacenan en dbflt.cpp en lugar de dbrfx.cpp, sin embargo, para habilitar la carga de ejecución flotante Biblioteca punto sólo cuando estén explícitamente referencia.
RFX_Text y RFX_Binary:
Est&as dos funciones previamente un búfer estático para contener información de cadena/binario y debe registrar estos búferes con ODBC SQLBindCol en lugar de registrar amp; valor. Debido a esto, estas dos funciones tienen mucho caso especial código.
RFX_Date:
ODBC devuelve información de fecha y hora de su propia estructura de datos TIMESTAMP_STRUCT. Esta función asigna dinámicamente una TIMESTAMP_STRUCT como "proxy" para enviar y recibir datos en tiempo de fecha. Varias operaciones deben transferir la información de fecha y hora entre el objeto de C++ CTime y el proxy TIMESTAMP_STRUCT. Ni que decir tiene que esto complica considerablemente esta función, pero es un buen ejemplo de cómo utilizar a un servidor proxy para la transferencia de datos.
RFX_LongBinary:
Esta es la biblioteca de clase única función RFX que no utilizar el enlace de la columna para recibir y enviar datos. Esta función ignora la operación de BindFieldToColumn y en su lugar, durante la operación de reparación, asigna el almacenamiento de información para mantener los datos entrantes de SQL_LONGVARCHAR o SQL_LONGVARBINARY, a continuación, realiza una llamada SQLGetData para recuperar el valor en el espacio de almacenamiento asignado. Cuando se dispone a enviar valores de datos en el origen de datos (es decir, operaciones NameValue y valor), esta función utiliza la funcionalidad DATA_AT_EXEC de ODBC. Ver 45 de nota técnica para obtener más información sobre cómo trabajar con SQL_LONGVARBINARY y SQL_LONGVARCHARs.
Al escribir su propia función RFX_ , a menudo podrá utilizar CFieldExchange::Default para implementar una operación dada. Examinar la aplicación de forma predeterminada para la operación en cuestión. Si realiza la operación estaría escribiendo en la función RFX_ puede delegar a la CFieldExchange::Default. Puede ver ejemplos de llamar a CFieldExchange::Default en dbrfx.cpp
Es importante llamar IsFieldType al comienzo de su función RFX y devolver inmediatamente si devuelve FALSE. Este mecanismo mantiene operaciones de parámetro se realice en outputColumnsy viceversa (como llamando a BindParam en un outputColumn). Además, IsFieldType automáticamente realiza un seguimiento del Conde de outputColumns (m_nFields) y params (m_nParams).
&Notas técnicas por número |nbsp; Notas técnicas por categoría