PDF de programación - Apuntes de VC++ 6

Imágen de pdf Apuntes de VC++ 6

Apuntes de VC++ 6gráfica de visualizaciones

Actualizado el 21 de Marzo del 2018 (Publicado el 26 de Enero del 2018)
427 visualizaciones desde el 26 de Enero del 2018
298,1 KB
9 paginas
Creado hace 3a (21/11/2016)
Apunte de Visual C++

 

Por: Demian Panello        demianpanello@yahoo.com.ar      
Capítulo XIII
Indice rápido del capítulo 13:

Motores de Bases de datos.
Aplicación Dialog Based con base de datos.
¿Cómo abrir una base de datos?
¿Cómo crear un Recordset?.
Creación de un objeto CDaoDatabase en el montón, (HEAP).
Abrir una base de datos de Access.
Función CDaoDatabase::Open().
Creación de un Recordset.
Función CDaoRecordset::Open().
La clase COleVariant.
Manejo de excepciones, (try ­ catch()).
Obtener el contenido de un campo de un registro.
Tipos de recordsets.
Función CDaoRecordset::MoveFirst().
Función CDaoRecordset::MoveNext().
Cerrar una base y destruir el objeto, (delete).

 

Bases de Datos:

Muchas de las aplicaciones comerciales que uno puede hacer involucran irremediablemente el uso de bases de datos.
Lenguajes de programación como Visual C++, Visual Basic, Delphi, Borland Build C++ 5.0, Visual Fox, etc. permiten crear
atractivas aplicaciones de bases de datos. Tal vez Visual Fox y Visual Basic planteen el desarrollo más sencillo y práctico
que con cualquiera de los restantes lenguajes nombrados.

Pero más allá de esto, las aplicaciones más versátiles y de mejor rendimiento se escriben con Delphi y los C++ de Microsoft
y Borland, por eso es inevitable no tocar el tema "bases de datos".

Para abrir una base de datos existen diferentes formas de acuerdo al motor de bases de datos que se elija e incluso podría
además plantear una conexión ODBC a través del Panel de Control.

Motores de bases de datos:

Los motores de bases de datos no son ni más ni menos que librerías que ofrecen una serie de objetos con sus respectivos
métodos y propiedades que sirven como interface entre la aplicación y la fuente de datos, (ejemplo una base de Access). Los
más comunes son:

DAO: Data Access Object ­ Es el tradicional motor JET de microsoft.

ADO: ActiveX Data Object ­ Es el nuevo modelo que utiliza tecnología COM.

RDO: Remote Data Object ­ Motor para el acceso a bases de datos remotas.

A esto se le puede sumar la posibilidad de crear una conexión ODBC para una base de datos y abrirla de forma indirecta a
través de dicha conexión.

Aplicación Dialog Based con bases de datos:

El Application Wizard permite crear un armazón de aplicación con base de datos, siempre y cuando seleccionemos la opción
de aplicación SDI. Considero que para comprender el uso de bases de datos este armazón no es el más óptimo ya que

además hay que agregar explicaciónes sobre las diferentes vistas y las relaciones con el documento de la aplicación.

Por eso en este ejemplo vamos a crear una simple aplicación basada en diálogo, (tan sólo tendrá uno), y escribiremos todo el
código necesario para poder abrir una base de datos y manipular los registros de diferentes tablas.

La aplicación constará de un diálogo con diversos controles, un par de listas y algunos cuadros de edición. Y usaremos estos
controles para almacenar los contenidos de algunos campos.

Cree una aplicación Dialog Based de nombre Basedao y diseñe el diálogo como muestra la figura:

Son dos controles listas y dos cuadros de edición, (además de los Statics para identificar cada control).

A continuación se muestra una tabla con las propiedades especificadas de cada control y además las variables asociadas a
crear:

Control
CListBox
CListBox

CEdit

CEdit

ID

IDC_LSTAUTORES
IDC_LSTLIB_AUT

IDC_TITULO

IDC_FECHA

Propiedades
por defecto
por defecto

Multiline, Vertical Scroll, Border, Read Only
AutoHScroll, Border, Read Only, Right Aligned

Text.

Variable asociada
CListBox m_lstAut
CListBox m_lstISBN
CString m_strTitulo

int m_nFecha

Veamos ahora qué debe hacer la aplicación.

La base de datos que usaremos es Biblio.mdb que viene con el Visual Studio, (en particular se instala con Visual Basic). En
primer lugar debemos abrir la base de datos de manera tal que se pueda acceder desde cualquier función del diálogo. Luego
al cargar el diálogo, (OnInitDialog()),  tomamos de una tabla, (creando un Recordset), todos los autores y cargamos la lista
Autores.

La base estará siempre abierta, por lo que, al seleccionar un autor de la lista Autores, podremos crear un nuevo Recordset
con todos los registros que contengan un ISBN que pertezca al autor seleccionado y cargarlos en la lista ISBN. Y finalmente
si se selecciona un ISBN se muestra la fecha de publicación y el título de la publicación en sus respectivos controles de
edición.

Es una aplicación sencilla pero que muestra interesantes operaciones con los registros de diferentes tablas utilizando
sencillas consultas SQL.

Tal véz muchos se pregunten ¿qué es un Recordset?, bueno simplemente se podría decir que un Recordset es un conjunto de
registros de una o varias tablas, creado a apartir de una consulta SQL.

¿Cómo abriremos una Base de datos?, ¿cómo crearemos un Recordset?.

Existen clases MFC que encapsulan métodos para tratar bases de datos y recordsets. Como usaremos el motor DAO,
utilizaremos las clases CDaoDatabase y CDaoRecordset, para lo cual en el archivo de implementación del diálogo
agregaremos el archivo de cabecera correspondiente: #include "afxdao.h".

Para que la base de datos sea "visible" en todo el diálogo definiremos una variable global de tipo CDaoDatabase; será un
puntero a la clase CDaoDatabase. Escriba en el archivo de implementación del diálogo, antes de la definición del constructor
la línea siguiente marcada en amarillo:

// basedaoDlg.cpp : implementation file

#include "stdafx.h"
#include "basedao.h"     
#include "basedaoDlg.h"
#include "afxdao.h"         //Archivo de cabecera para usar DAO

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CDaoDatabase *pBD = new CDaoDatabase;     //Puntero global para ver la base en todos los procedimientos
/////////////////////////////////////////////////////////////////////////////
// CBasedaoDlg dialog

CBasedaoDlg::CBasedaoDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CBasedaoDlg::IDD, pParent)
{

....................

Para abrir la base de datos crearemos una función miembro de CBasedaoDlg. En Class View pulse con el botón derecho
sobre la clase CBasedaoDlg y seleccione del menú contextual la opción Add Member Function. El nombre de la función
será AbrirBase y como tipo escriba void, pulse Aceptar y se editará la función. Alli escriba:

void CBasedaoDlg::AbrirBase()
{

pBD­>Open ("biblio.mdb");  

}

Se abre la base de datos con el método Open(). Tiene varios parámetros optativos:

virtual void Open( LPCTSTR lpszName, BOOL bExclusive = FALSE, BOOL bReadOnly = FALSE, LPCTSTR
lpszConnect = _T("") );

El primer parámetro, (el único que usamos en nuestra aplicación), es el nombre de la base de datos incluído el path. En
nuestro caso como la base Biblio.mdb la colocamos en el Workspace del proyecto no hace falta especificarle el path. El
siguiente parámetro indica el modo de apertura y será TRUE en caso que se abra de modo exclusivo y FALSE para
compartido, (omitir este parámetro implica modo compartido, o sea FALSE). El tercer parámetro es para especificar si se
abrirá la base de sólo lectura, (TRUE) o lectura/escritura, (FALSE), (también si se omite este parámetro se supone FALSE).
Y el último parámetro, si el primero es una cadena vacía "" entonces este último será el nombre de la conexión ODBC.

_T() es una macro que permite portabilidad para UNICODE y ANSIS, (podría haber omitido ésto y simplemente escribir la
cadena).

En lugar de tener CDaoDatabase pBD = new CDaoDatabase, se podría haber declarado una variable CDaoDatabase y un
puntero a CDaoDatabase. Luego en AbrirBase() abriríamos la base con la variable y luego le asignamos la dirección de

memoria al puntero. Pero usando new es más prolijo.

Ahora hay que escribir la llamada a AbrirBase() en OnInitDialog(), así al cargar la aplicación se abre la base. Simplemente
escriba lo que está marcado en amarillo:

BOOL CBasedaoDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

   // Set the icon for this dialog. The framework does this automatically
    // when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon
    
    // TODO: Add extra initialization here
    
    AbrirBase();    //Llamo al procedimiento que abre la base de datos.

    return TRUE;

}

Una vez que se abre la base, inmediatamente se debería cargar la lista Autores, por eso como hizo con AbrirBase(), agregue
una función miembro al diálogo de tipo void y de nombre CargaAutores() y escriba:
 
//Procedimiento que carga la lista de autores
void CBasedaoDlg::CargaAutores()
{
COleVariant v;  (1) 
CString dato;  (2)
CDaoRecordset recAut(pBD);  (3)
 
try  (4)
    {
    //Creo el recordset 
    recAut.Open (dbOpenDynaset,"SELECT author FROM authors ORDER BY author", dbReadOnly); (5)
    recAut.MoveFirst ();  (6)                  //Voy al primer registro
    while (!recAut.IsEOF ())   (7)         //Mientras no sea fin de archivo
    {    
        recAut.GetFieldValue ("author", v);   (8)
        dato.Format ("%s%s", dato,v.bstrVal);   (9)
        m_lstAut.AddString (dato);  (10) 
        dato.Empty ();                (11)
        recAut.MoveNext();       (12)     
    }
   recAut.Close(); 
    }
    catch( CDaoException* e )     (13)       //De existir un error al abrir o leer en la base el flujo
                                                                    //pasa por acá y muestro mi mensaje de error
    {
    
    AfxMessageBox("Error de base de datos", MB_OK);
    e­>Delete( );       (14)
    }

}
 
En (1) y en (2) se declaran variables, una COleVariant y otra CString. Los métodos de la clase CDaoRecordset, (que
usaremos en esta función), devuelven los contenidos de los campos de una tabla en variables de tipo Variant, encapsulado en

la clase COleVariant. Así que tendremos una variable de tipo COleVariant en la función para poder obtener el contenido del
campo necesario, pero luego lo formatearemos a
  • Links de descarga
http://lwp-l.com/pdf8478

Comentarios de: Apuntes de VC++ 6 (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad