Compartir a través de


Intercambio de campos de registros: Trabajar con el código de asistente

Actualización: noviembre 2007

Este tema explica el código que generan el Asistente para aplicaciones MFC y el comando Agregar clase (como se describe en Agregar un consumidor ODBC de MFC) para la compatibilidad con RFX y cómo puede resultar conveniente modificar ese código.

Nota:

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

Al crear una clase de conjunto de registros mediante el Asistente para aplicaciones MFC o el comando Agregar clase, el asistente escribe los siguientes elementos (relacionados con RFX) por usted, basándose en las opciones seleccionadas para origen de datos, tablas y columnas en el asistente:

  • Declaraciones de los miembros de datos de campo del conjunto de registros en la clase de conjunto de registros

  • Una función de reemplazo de CRecordset::DoFieldExchange

  • Código de inicialización de los miembros de datos de campo en el constructor de la clase de conjunto de registros

Declaraciones de los miembros de datos de campo

El asistente escribe una declaración de la clase de conjunto de registros en un archivo .h similar a los siguientes para la clase CSections:

class CSections : public CRecordset
{
public:
   CSections(CDatabase* pDatabase = NULL);
   DECLARE_DYNAMIC(CSections)

// Field/Param Data
   CString   m_strCourseID;
   CString   m_strInstructorID;
   CString   m_strRoomNo;
   CString   m_strSchedule;
   CString   m_strSectionNo;

// Overrides
   // Wizard generated virtual function overrides
   protected:
   virtual CString GetDefaultConnect();  // Default connection string
   virtual CString GetDefaultSQL();      // Default SQL for Recordset
   virtual void DoFieldExchange(CFieldExchange* pFX);  // RFX support

// Implementation
#ifdef _DEBUG
   virtual void AssertValid() const;
   virtual void Dump(CDumpContext& dc) const;
#endif

};

Si agrega miembros de datos de parámetro o nuevos miembros de datos de campo y los enlaza manualmente, agréguelos a continuación de los generados por el asistente.

Asimismo, observe que el asistente reemplaza la función miembro DoFieldExchange de la clase CRecordset.

Función de reemplazo para DoFieldExchange

DoFieldExchange representa la esencia de RFX. El marco de trabajo llama a DoFieldExchange cada vez que necesita mover datos desde el origen de datos al conjunto de registros o viceversa. DoFieldExchange también permite obtener información sobre miembros de datos de campo a través de las funciones miembro IsFieldDirty e IsFieldNull.

La siguiente función de reemplazo para DoFieldExchange corresponde a la clase CSections. El asistente escribe la función en el archivo .cpp para la clase de conjunto de registros.

void CSections::DoFieldExchange(CFieldExchange* pFX)
{
   pFX->SetFieldType(CFieldExchange::outputColumn);
   RFX_Text(pFX, "CourseID", m_strCourseID);
   RFX_Text(pFX, "InstructorID", m_strInstructorID);
   RFX_Text(pFX, "RoomNo", m_strRoomNo);
   RFX_Text(pFX, "Schedule", m_strSchedule);
   RFX_Text(pFX, "SectionNo", m_strSectionNo);
}

Observe las siguientes características clave de la función:

  • Esta sección de la función se denomina asignación de campos.

  • Una llamada a CFieldExchange::SetFieldType, a través del puntero pFX. Esta llamada especifica que todas las llamadas a la función RFX hasta el final de DoFieldExchange o la siguiente llamada a SetFieldType se consideran columnas de resultados. Para obtener más información, vea CFieldExchange::SetFieldType.

  • Varias llamadas a la función global RFX_Text, una por cada miembro de datos de campo (todas las cuales son variables CString en el ejemplo). Estas llamadas especifican la relación entre un nombre de columna del origen de datos y un miembro de datos de campo. Las funciones RFX realizan la transferencia de datos real. La biblioteca de clases proporciona funciones RFX para todos los tipos de datos comunes. Para obtener más información sobre las funciones RFX, vea Intercambio de campos de registros: Utilizar las funciones de RFX.

    Nota:

    El orden de las columnas en el conjunto de resultados debe coincidir con el de las llamadas a la función RFX en DoFieldExchange.

  • El puntero pFX a un objeto CFieldExchange que pasa el marco de trabajo al llamar a DoFieldExchange. El objeto CFieldExchange especifica la operación que debe realizar DoFieldExchange, la dirección de la transferencia y otra información de contexto.

Constructor de conjunto de registros

El constructor del conjunto de registros que generan los asistentes contiene dos elementos relacionados con RFX:

  • Una inicialización para cada miembro de datos de campo

  • Una inicialización para el miembro de datos m_nFields, que contiene el número de miembros de datos de campo

El constructor del ejemplo de conjunto de registros CSections tiene este aspecto:

CSections::CSections(CDatabase* pdb)
   : CRecordset(pdb)
{
   m_strCourseID = "";
   m_strInstructorID = "";
   m_strRoomNo = "";
   m_strSchedule = "";
   m_strSectionNo = "";
   m_nFields = 5;
}
Nota:

Si agrega miembros de datos de campo manualmente, como podría hacerlo al enlazar nuevas columnas dinámicamente, debe incrementar m_nFields. Puede hacerlo anexando otra línea de código, como:

m_nFields += 3;

Éste es el código para agregar tres nuevos campos. Si agrega nuevos miembros de datos de parámetro, debe inicializar el miembro de datos m_nParams, que contiene el número de miembros de datos de parámetro. Coloque el código de inicialización de m_nParams fuera de los paréntesis.

Vea también

Conceptos

Intercambio de campos de registros (RFX)