| INDICE ACCESO A DATOS DAO | |||
|
5.4 Usar Objetos de Acceso a Datos
Los Objetos de acceso a datos (DAO) son una serie de objetos que le permiten tener acceso y manipular datos mediante programación en bases de datos locales o remotas. Puede utilizar DAO para administrar bases de datos, así como sus objetos y su estructura.
En esta sección aprenderá a utilizar DAO para recuperar y usar datos de una base de datos.
5.4.1 Introducción
Para tener acceso y manipular datos mediante programa debe comprender la jerarquía de DAO.
El orden de los objetos en DAO se conoce como su modelo de objetos. El modelo de objetos de DAO le permite escribir código que puede aprovechar la funcionalidad de la base de datos.
El Modelo de Objetos de DAO
El modelo de objetos de DAO define la jerarquía de los objetos DAO. Para incorporar a una aplicación la funcionalidad de DAO, debe ser capaz de exponer un objeto dentro de esta jerarquía.
A continuación se muestra ilustración que refleja el modelo de objetos de DAO.
Deberá utilizar esta jerarquía cuando cree o tenga acceso a determinados objetos.
Por ejemplo, la instrucción siguiente abre una base de datos:
Set dbMydb = DBEngine.Workspaces(0).OpenDatabase("Mibd.mdb")
En la tabla siguiente se enumeran algunos de los Objetos de acceso a datos y se describe su uso.
|
Objeto |
Descripción |
|
Workspace |
Contiene las bases de datos abiertas. |
|
Database |
Una base de datos abierta. |
|
Recordset |
Los registros de una tabla o los registros que resultan de ejecutar una consulta. |
|
QueryDef |
Una definición almacenada de una consulta. |
|
TableDef |
Una definición almacenada de una tabla. |
Los Objetos DBEngine y Workspace
DBEngine
es el objeto de nivel superior dentro del modelo de objetos DAO. Contiene y controla todos los demás objetos de la jerarquía de DAO.
El objeto Workspace define una sesión para el usuario y determina cómo interactúa su aplicación con los datos. Si abre una base de datos sin especificar un objeto Workspace, se utilizará DBEngine.Workspaces(0) como valor predeterminado.
5.4.2 Trabajar con Recordsets
Un objeto Recordset contiene un conjunto de registros de una base de datos. Puede utilizar el objeto Recordset para recuperar mediante programa información de la base de datos.
En esta sección se explica cómo crear y utilizar Recordsets.
Abrir una Base de Datos
El primer paso para crear una aplicación de base de datos consiste en abrir la base de datos. Deberá declarar una variable como un objeto Database y después utilizar el método OpenDatabase para abrir la base de datos.
La variable de objeto Database se refiere a su base de datos. Utilice la instrucción Set para asignarla a una base de datos.
El siguiente ejemplo de código abre una base de datos en el espacio de trabajo predeterminado:
Dim dbMydb As Database
Set dbMydb = OpenDatabase ("C:\Archivos de programa\DevStudio\VB\Nwind.mdb")
El método OpenDatabase acepta los argumentos siguientes:
|
Argumento |
Propósito |
|
Base_datos |
Cadena que especifica el nombre de una base de datos existente. |
|
Opciones |
Para un espacio de trabajo de Microsoft Jet, True o False. Si abre una base de datos con el argumento opciones True, ningún otro usuario podrá abrir la base de datos. El valor predeterminado es False. |
|
Sólo_lectura |
True o False. Si es True, no se permite realizar ninguna modificación. El valor predeterminado es False. |
|
Conexión |
Cadena que especifica diversa información de conexión, incluyendo contraseñas. |
Puede mejorar el rendimiento si abre una base de datos para uso exclusivo si no hay varios usuarios.
Cuando haya terminado de trabajar con una base de datos, ciérrela con el método Close, como en el ejemplo siguiente:
dbMydb.Close
Crear un Recordset
Una vez que haya abierto una base de datos, puede manipular los datos almacenados en la misma si crea un Recordset. Declare una variable como un objeto Recordset y utilice el método OpenRecorset para crear el Recordset.
La variable de objeto Recordset hace referencia a su Recordset. Utilice la instrucción Set para asignarla a un Recordset.
El siguiente ejemplo de código abre una base de datos y crea un Recordset:
Dim dbMydb As Database
Dim recEmployees As Recordset
Set dbMydb = OpenDatabase _
("C:\Archivos de programa\DevStudio\VB\Nwind.mdb")
Set recEmployees = dbMydb.OpenRecordset ("Empleados")
En la tabla siguiente se enumeran y describen los argumentos del método OpenRecordset.
|
Argumento |
Descripción |
|
Origen |
Especifica el origen del Recordset. El origen es una cadena que indica un nombre de tabla, un nombre de consulta o una instrucción SQL. |
|
Tipo |
El tipo de objeto del Recordset que se va a crear, como dbOpenTable, dbOpenDynaset o dbOpenSnapshot. |
|
Opciones |
Determina cómo se abre el Recordset. Por ejemplo, puede abrir un Recordset y permitir el desplazamiento sólo hacia delante por el mismo con la opción dbForwardOnly. |
|
Ediciones |
Determina el bloqueo del Recordset. Por ejemplo, si especifica dbPessimistic para el argumento ediciones, el Recordset se bloqueará durante la modificación. |
El desplazamiento por los Recordsets se basa en el concepto de un registro actual. Suponga que el registro actual es un determinado registro que está resaltado por un cursor invisible a medida que se desplaza por el Recordset.
Utilice los métodos Move para desplazarse por los registros de un Recordset:
El objeto Recordset ofrece propiedades que puede utilizar mientras se desplaza por un Recordset.
La propiedad RecordCount de un Recordset de tipo table siempre refleja fielmente el número de registros de la tabla y se ve afectada inmediatamente cuando algún usuario agrega o elimina un registro.
Nota: Puede utilizar la función Count de SQL para determinar el número de registros de un Recordset. Por ejemplo, Select Count (*) From Empleados devuelve el número de registros de la tabla Empleados.
La propiedad AbsolutePosition devuelve o establece el número relativo del registro actual de un Recordset. AbsolutePosition es relativo a 0 (es decir, el primer registro de un Recordset es el registro 0). Si asigna a AbsolutePosition el valor 3, el cuarto registro será el registro actual.
La propiedad AbsolutePosition de un registro puede cambiar a medida que se agregan y eliminan registros de un Recordset. Para volver a un registro específico, utilice la propiedad Bookmark.
5.4.3 Modificar Datos
Una vez que haya creado un Recordset, puede utilizar los métodos del objeto Recordset para actualizar, agregar y eliminar registros. En esta sección se explica cómo actualizar, agregar y eliminar datos desde una base de datos de Microsoft Jet
Actualizar Registros
Para actualizar un registro primero debe invocar al método Edit, llenar los campos del registro con los datos apropiados y, después, invocar al método Update.
Si ejecuta el método Update sin utilizar primero el método Edit, se producirá un error de tiempo de ejecución.
Puede comprobar la propiedad EditMode para determinar si se han ejecutado los métodos Edit o AddNew. Esto puede resultar útil en un comando Guardar que ejecute un método Update inmediatamente, si ya se ha ejecutado un método Add; o cuando ejecute el método Edit seguido del método Update si el usuario está modificando el registro actual.
En la tabla siguiente se describen las constantes que indican el estado de modificación del registro actual.
|
Constante |
Descripción |
|
DbEditNone |
Si no está realizándose ninguna operación de edición. |
|
DbEditInProgress |
Si se ha llamado al método Edit y el registro actual está en el búfer de copia. |
|
DbEditAdd |
Si se ha llamado al método AddNew y el registro actual del búfer de copia es un registro nuevo que no se ha guardado en la base de datos. |
Agregar Registros
Utilice el método AddNew para agregar un nuevo registro al Recordset. El registro no se guardará realmente en la base de datos hasta que ejecute el método Update.
Utilice el método CancelUpdate para cancelar el método AddNew o Edit de forma que no se realicen los cambios a una base de datos.
Eliminar Registros
Utilice el método Delete para quitar el registro actual de un Recordset. No se mostrará ninguna advertencia o petición. Puede agregar un mensaje de advertencia en la rutina de la eliminación si es necesario.
La eliminación de un registro no provoca automáticamente que el registro siguiente pase a ser el registro actual. Para que el registro siguiente se convierta en el registro actual debe utilizar el método MoveNext.
Usar DAO con el Control Data
En una misma aplicación puede combinar DAO y el control Data. Esto es útil si desea utilizar controles enlazados en una aplicación y seguir teniendo la misma flexibilidad de uso que ofrece DAO.
La propiedad Recordset del control Data devuelve un objeto Recordset.
5.4.4 Buscar Registros
En esta sección se describe cómo utilizar uno de los métodos Find o el método Seek para buscar datos en un Recordset.
Buscar en un Dynaset o un Snapshot
Puede utilizar los métodos FindFirst, FindLast, FindNext y FindPrevious para encontrar un registro en un dynaset o en un snapshot.
El criterio de búsqueda que especifique debe ser equivalente a una instrucción Where de SQL, sin la palabra clave Where.
Buscar en una Tabla
Utilice el método Seek para buscar un registro en un Recordset de tipo table. El Recordset debe tener definido un índice antes de poder utilizar el método Seek. En la tabla siguiente se describen las posibles comparaciones que puede utilizar con el método Seek.
|
Cadena de comparación |
Descripción |
|
"=" |
Igual que los valores de clave especificados. |
|
">" |
Mayor que los valores de clave especificados. |
|
">=" |
Mayor o igual que los valores de clave especificados. |
|
"<=" |
Menor o igual que los valores de clave especificados. |
|
"<" |
Menor que los valores de clave especificados. |
Utilice varias claves para los índices que tienen varios campos.
5.4.5 Uso de Consultas
En esta sección se explica el uso de consultas almacenadas e instrucciones SQL para ver o modificar datos en una base de datos.
Usar una Consulta de Selección
Para utilizar una consulta de selección almacenada, basta con proporcionar el nombre de la consulta en el método OpenRecordset del objeto Database. El siguiente ejemplo de código crea un Recordset basado en una consulta de selección almacenada:
Set recProducts = dbMydb.OpenRecordset("Productos pedidos")
También puede utilizar el método OpenRecordset del objeto QueryDef para recuperar los resultados de la consulta. El siguiente ejemplo de código crea un Recordset con un objeto QueryDef basado en una consulta de selección almacenada:
Dim qryProducts As QueryDef
Set qryProducts = dbMydb.QueryDefs("Productos pedidos")
Set recProducts = qryProducts.OpenRecordset
Si la consulta almacenada requiere parámetros, utilice la colección Parameters del objeto QueryDef para establecer parámetros. El código siguiente establece un parámetro a una consulta almacenada:
Set qryProducts.Parameters("Fecha de inicio") = _
CDate(txtBeginDate.text)
Utilice el método CreateQueryDef del objeto Database para crear una nueva consulta en tiempo de ejecución y almacenar la consulta en una base de datos. El siguiente código de ejemplo crea y almacena una consulta nueva:
Set qryNewQuery = dbMydb.CreateQueryDef _
("Mi consulta", "Select * From Empleados")
Usar una Consulta de Acciones
Una consulta de acciones es una instrucción SQL que actualiza, elimina o inserta registros en una base de datos. Una consulta de acciones no devuelve ninguna fila. Utilice el método Execute del objeto Database para ejecutar una consulta de acciones. El siguiente ejemplo ejecuta una consulta de acciones y muestra el número de registros afectados:
dbMydb.Execute "Actualizar productos", dbFailOnError
Msgbox "Esta consulta cambió " & _
dbMydb.RecordsAffected & _
" registros."
Utilice la opción dbFailOnError para hacer que el método Execute devuelva un error de tiempo de ejecución si alguno de los registros afectados está bloqueado o no se puede actualizar o eliminar.
La propiedad RecordsAffected devuelve el número de registros que se modificaron, insertaron o eliminaron.
También puede utilizar un objeto QueryDef para ejecutar una consulta de acciones. Si la consulta requiere parámetros, utilice la colección Parameters del objeto QueryDef para establecer los parámetros, como se muestra en este ejemplo:
Dim qryUpdate As QueryDef
Set qryUpdate = db.QueryDefs("Actualizar precios")
qryUpdate.Parameters ("Escribir aumento") = .10
qryUpdate.Execute dbFailOnError
Msgbox qryUpdate.RecordsAffected
Introducción a SQL
Puede utilizar SQL para recuperar únicamente un subconjunto de filas o para recuperar información de dos tablas a la vez. SQL le permite especificar exactamente qué registros desea recuperar y en qué orden.
Si hay un error en la instrucción SQL (por ejemplo, si especifica un nombre de campo no válido), aparecerá un mensaje de error de tiempo de ejecución similar a Demasiados pocos parámetros. Se esperaban 2. Si recibe este error, compruebe la cadena SQL y asegúrese de que los nombres del campo y de la tabla que ha indicado son válidos.
Utilice la instrucción SELECT de SQL para recuperar registros. La sintaxis de SELECT es la siguiente:
SELECT lista_campos
FROM nombres_tabla
WHERE condiciones_búsqueda
ORDER BY lista_campos
El ejemplo de código siguiente recupera únicamente los campos Apellidos e IdEmpleado en los que IdEmpleado es mayor que 5. Los registros se recuperan en orden descendente según el Id. de empleado:
SELECT [Apellidos], [IdEmpleado]
FROM Empleados
WHERE [IdEmpleado] > 5
ORDER BY [IdEmpleado] DESC
Utilice la cláusula WHERE para limitar la selección. El signo de número (#) indica valores literales de fecha. Los valores literales de fecha especificados en una instrucción SQL deben tener el formato de fecha de EE.UU. (por ejemplo, el 9 de mayo de 1996 se escribe como 5/9/96).
Utilice la cláusula ORDER BY para crear un Recordset en un orden determinado. La opción ASC indica orden ascendente y DESC indica orden descendente. El siguiente ejemplo de código selecciona todos los campos de la tabla Empleados, ordenados por apellido:
SELECT * FROM Empleados ORDER BY [Apellidos] DESC
Puede utilizar una operación de combinación con el fin de combinar registros procedentes de múltiples tablas. Por ejemplo, si quiere mostrar nombres de categoría y nombres de producto de distintas tablas, puede combinar registros de la tabla Categorías y de la tabla Productos.
La cláusula INNER JOIN especifica que desea obtener los registros de la tabla Categorías cuyo Id. de categoría coincida con el mismo IdCategoría en la tabla Productos. El siguiente ejemplo de código combina información de la tabla Categorías y la tabla Productos:
strSQL = "SELECT Categorías.[NombreCategoría], " & _
"Productos.[NombreProducto] " & _
"FROM Categorías " & _
"INNER JOIN Productos ON " & _
"Productos.[IdCategoría] = Categorías.[IdCategoría]"
A continuación veamos una ilustración que muestra el resultado de la operación de combinación.
Usar SQL
En general, es más eficaz utilizar una consulta almacenada que crear una instrucción SQL en tiempo de ejecución.
Puede crear dinámicamente una cadena SQL en tiempo de ejecución y utilizar el método OpenRecordset para crear un Recordset basado en la instrucción SQL. Por ejemplo:
Dim strSQL As String
strSQL = "Select * From Empleados"
Set recEmployees = dbMydb.OpenRecordset (strSQL)
La instrucción Update de SQL modifica registros existentes. La opción dbFailOnError hace que la actualización se deshaga si se produce un error durante la actualización. Además, se invoca al controlador de errores. El código siguiente ilustra el uso de una instrucción Update de SQL:
strSQL = "UPDATE [Detalles de pedidos] SET [Descuento] = 1 " & _
"WHERE [Descuento] = 0"
dbMydb.Execute strSQL, dbFailOnError
Puede utilizar la instrucción Insert de SQL para insertar un nuevo registro. Veamos código de ejemplo que inserta un registro en la tabla Empleados.
strSQL = "INSERT INTO EMPLEADOS " & _
"([Nombre], [Apellidos]) " & _
"VALUES ('Juan', 'Gracia')"
dbMydb.Execute strSQL, dbFailOnError