Intercambio de campos de registros: Trabajar con el código de asistente
Nota:
El Asistente para consumidores ODBC MFC no está disponible en Visual Studio 2019 ni en versiones posteriores. Aun así, puede crear un consumidor manualmente.
En este tema se explica el código que el Asistente para aplicaciones MFC y Agregar clase (como se describe en Agregar un consumidor ODBC de MFC) escriben para admitir RFX y cómo se puede modificar este 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 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).
Cuando cree una clase de conjunto de registros con el Asistente para aplicaciones MFC o Agregar clase, el asistente escribirá automáticamente los siguientes elementos relacionados con RFX, en función de las opciones de origen de datos, tabla y columna que seleccionó en el asistente:
Declaraciones de los miembros de datos de campo del conjunto de registros en la clase de conjunto de registros.
Una invalidación de
CRecordset::DoFieldExchange
.Una inicialización de los miembros de datos de campo del conjunto de registros en el constructor de clase del conjunto de registros.
Declaraciones de miembro de datos de campo
El asistente escribe una declaración de clase de conjunto de registros en un archivo .h que es similar a la siguiente 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ámetros o nuevos miembros de datos de campo enlazados por usted mismo, debe incluirlos después de los generados por el asistente.
Además, tenga en cuenta que el asistente reemplaza la función miembro DoFieldExchange
de la clase CRecordset
.
Invalidación de DoFieldExchange
DoFieldExchange es la esencia de RFX. El marco llama a DoFieldExchange
cada vez que necesita mover datos del origen de datos al conjunto de registros o bien del conjunto de registros al origen de datos. DoFieldExchange
también admite la obtención de información sobre los miembros de datos de campo a través de las funciones miembro IsFieldDirty e IsFieldNull.
La siguiente invalidación DoFieldExchange
es para 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 campo".
Una llamada a
CFieldExchange::SetFieldType
, mediante el punteropFX
. Esta llamada especifica que todas las llamadas de función RFX hasta el final deDoFieldExchange
o la siguiente llamada aSetFieldType
son columnas de salida. 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 ellas variablesCString
en el ejemplo). Estas llamadas especifican la relación entre un nombre de columna en el origen de datos y un miembro de datos de campo. Las funciones de RFX llevan a cabo 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 del conjunto de resultados debe coincidir con el orden de las llamadas de función RFX de
DoFieldExchange
.El puntero
pFX
a un objeto CFieldExchange que el marco pasa al llamar aDoFieldExchange
. El objetoCFieldExchange
especifica la operación queDoFieldExchange
va a llevar a cabo, la dirección de la transferencia y otra información de contexto.
Recordset Constructor
El constructor del conjunto de registros que escriben 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 para el ejemplo del 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 sucedería si enlaza nuevas columnas dinámicamente, debe incrementar m_nFields
. Para hacerlo, agregue otra línea de código, como la siguiente:
m_nFields += 3;
Este es el código para agregar tres nuevos campos. Si agrega miembros de datos de parámetros, debe inicializar el miembro de datos m_nParams, que contiene el número de miembros de datos de parámetros. Coloque la inicialización m_nParams
fuera de los corchetes.