Cuando se quiera acceder a los datos de una tabla, el IDE de Visual C++ 6.0 permite añadir fácilmente al proyecto una nueva clase de tipo MFC derivada de CRecordset o de CDaoRecordset. Después de haber especificado el origen de los datos y la tabla a considerar, se genera automáticamente una clase que tiene necesidad de definir específicamente un cierto número de variables a usar para la comunicación con la base de datos y con la eventual ventana de visualización. Tal comunicación se realiza por medio de funciones especializadas, definidas adrede por la MFC, las cuales obligan a la nueva clase a conocer el tipo de los campos a los cuales accede.
Las clases CBufferRecSet y CBufferDaoRecSet, derivadas de CRecordset y CDaoRecordset respectivamente, han sido pensadas para librarse de las citadas necesidades: estas clases mantienen un buffer dinámico que asocia automáticamente una variable a cada campo del recordset, y además contienen métodos para realizar el intercambio de datos entre la base de datos y el buffer (DoFieldExchange) y entre el buffer y una ventana de visualización (DDX_FieldVariant), encargándose de llamar a las funciones oportunas de la MFC según el tipo de campo en objeto. Asimismo, prevén métodos para el acceso directo a las variables del buffer, bien en lectura, bien en escritura, y permiten definir un filtro sobre el recordset en el momento de realizar el Open, pasando como parámetro el nombre del campo filtrado y el puntero a una variable con el valor al que se refiere (actualmente se prevé el filtro sobre un solo campo). En su implementación se mantiene la compatibilidad respectivamente con las clases CRecordView y CDaoRecordView de la MFC.
Veamos en los listados mostrados a continuación un ejemplo de la simplificación que se obtiene usando las clases CBufferRecSet y CBufferDaoRecSet en el lugar de las originales CRecordset y CDaoRecordset. A la izquierda se encuentra el código tal y como ha sido generado por el AppWizard, mientras que a la derecha se encuentra el correspondiente código modificado para utilizar las nuevas clases. El significado que se atribuye a los colores es el siguiente:
código modificado | código quitado | código añadido |
Después de haber creado un nuevo proyecto de tipo MFC AppWizard (exe), con las opciones Single document y Database view with file support (con elección de un Data source de tipo DAO que accediese a la tabla Pedidos de la base de datos de ejemplo de Microsoft Access - Neptuno.mdb), se han añadido en el dialog box generado tantos edit box como campos de la tabla, y después con el ClassWizard se han conectado los edit box a las variables asociadas a los campos.
class CDaoDBSet : public CDaoRecordset
|
class CDaoDBSet : public CBufferDaoRecSet
|
CDaoDBSet::CDaoDBSet(CDaoDatabase* pdb)
|
CDaoDBSet::CDaoDBSet(CDaoDatabase* pdb)
|
void CDaoDBSet::DoFieldExchange(CDaoFieldExchange* pFX)
|
|
void CDaoDBView::DoDataExchange(CDataExchange* pDX)
|
void CDaoDBView::DoDataExchange(CDataExchange* pDX)
|
Después de haber creado un nuevo proyecto de tipo MFC AppWizard (exe), con las opciones Single document y Database view with file support (con elección de un Data source de tipo ODBC que accediese a la tabla Pedidos de la base de datos de ejemplo de Microsoft Access - Neptuno.mdb), se han añadido en el dialog box generado tantos edit box como campos de la tabla, y después con el ClassWizard se han conectado los edit box a las variables asociadas a los campos.
class CODBCDBSet : public CRecordset
|
class CODBCDBSet : public CBufferRecSet
|
CODBCDBSet::CODBCDBSet(CDatabase* pdb)
|
CODBCDBSet::CODBCDBSet(CDatabase* pdb)
|
void CODBCDBSet::DoFieldExchange(CFieldExchange* pFX)
|
|
void CODBCDBView::DoDataExchange(CDataExchange* pDX)
|
void CODBCDBView::DoDataExchange(CDataExchange* pDX)
|