El modelo de acceso a datos ADO 1. Presentación La biblioteca de objetos ADO (ActiveX Data Objects) le permite escribir una aplicación que accede a datos situados en un servidor de bases de datos y manejar éstas mediante un proveedor OLE DB. ADO tiene la ventaja de ser fácil de usar, con buen rendimiento y usando poca memoria y espacio de disco. ADO ofrece las funcionalidades básicas que permiten crear aplicaciones cliente/servidor y aplicaciones Web. Para poder utilizar la biblioteca de objetos ADO, es necesario seleccionar la referencia Microsoft ActiveX Data Objects 6.0 Library en la lista de referencias a las bibliotecas de objetos. Si esta referencia no está disponible, debe seleccionar el archivo MSADO15.dll mediante el botón de comando Examinar. Generalmente, este archivo está ubicado en el directorio C:\Archivos de programa\Common Files\System\ADO. Igualmente puede utilizar las extensiones ADO seleccionando la referencia Microsoft ADO Ext 6.0 for DLL and Security (archivo MSADOX.DLL). Estas extensiones le permiten acceder a objetos complementarios (catalgo, users, views…) del modelo ADO. El archivo de ayuda ADO210.chm ubicado en el directorio C:\Archivos de Programa\Common Files\MicrosoftShared\Office 15\1036, le permite obtener información detallada sobre la utilización de los modelos ADO. 2. ADO y OLE DB OLE DB es una tecnología que permite un acceso uniforme a los datos almacenados en diversas fuentes de información: bases de datos relacionales o no relacionales, correo, sistemas de archivos… Prácticamente todos los datos de la empresa son accesibles mediante OLE DB. ADO (ActiveX Data Objects) es la interfaz de programación utilizada para acceder a los datos de todos los proveedores de datos OLE DB. Arquitectura tecnológica © Editions ENI – Tous droits réservés – Copie personnelle de jose rodriguez - 1- Los proveedores de datos o Providers son controladores que permiten comunicar con los orígenes de datos. 3. Jerarquía de los objetos ADO - 2- © Editions ENI – Tous droits réservés – Copie personnelle de jose rodriguez 4. Modelo de base de programación ADO ADO le permite ejecutar la siguiente secuencia de acciones: l establecer una conexión a una base de datos OLE DB o ODBC por medio del objeto Connection, l crear un comando que permita enviar una consulta SQL al servidor utilizando el objeto Command, l ejecutar el comando. Si el comando devuelve filas, almacenarlas en un objeto Recordset, l utilizar los datos del objeto Recordset: ordenar, filtrar, modificar, eliminar los registros, l actualizar los datos: validar los eventuales cambios del objeto Recordset, incorporar las actualizaciones en una © Editions ENI – Tous droits réservés – Copie personnelle de jose rodriguez - 3- transacción, l si se ha utilizado una transacción: aceptar o desechar las actualizaciones aportadas durante ésta. Ejemplo Dim cnn As New ADODB.Connection Dim cmd As New ADODB.Command Dim rs As New ADODB.Recordset ’ Etapa 1: establecer una conexión a un origen de datos ’ SQL Server mediante la tecnología OLEDB cnn.Open "Provider=SQLOLEDB.1;Data Source=SRV; _ & "Initial Catalog=Presupuesto;" _ & "Integrated Security=SSPI;Persist Security Info=False;" ’ Etapa 2: crear un comando Set cmd.ActiveConnection = cnn cmd.CommandText = "SELECT * FROM Clientes" ’ Etapa 3: ejecutar el comando rs.CursorLocation = adUseClient rs.Open cmd, , adOpenStatic, adLockBatchOptimistic ’ Etapa 4 : manipular los datos rs.Filter = "CLI_CIUDAD LIKE ’Barcelona’" Do While Not rs.EOF rs("CLI_PAÍS") = "E" rs.MoveNext Loop ’ Etapa 5: actualizar los datos modificados cnn.BeginTrans rs.UpdateBatch ’ Etapa 6: terminar la actualización de la base SQL If MsgBox("¿Desea confirmar las actualizaciones?", _ vbYesNo) = vbYes Then cnn.CommitTrans Else cnn.RollbackTrans End If 5. Descripción de los objetos ADO - 4- Connection Representa una conexión con un origen de datos. Command Define un comando específico que debe ejecutarse sobre un origen de datos. © Editions ENI – Tous droits réservés – Copie personnelle de jose rodriguez Recordset Representa el conjunto de registros completo de una tabla de bases de datos o los resultados de un comando (ej: resultados de una consulta SQL). Record Funciona esencialmente como un objeto Recordset de una sola línea. El origen de los datos en un objeto Record puede ser un comando que devuelve una línea de datos a partir del servidor. La utilización de objetos Record en lugar de Recordset para recibir los resultados de una consulta que devuelve una sola línea de datos elimina el exceso de tratamiento vinculado a la instanciación del objeto Recordset, que es más complejo. Stream Proporciona el medio para leer, escribir y gestionar un flujo de bytes formado por texto o datos binarios. 6. Las colecciones ADO Parameters Colección de todos los objetos Parameter de un objeto Command. El objeto Parameter representa un parámetro o argumento asociado a un objeto Command basado en una consulta con parámetros o un procedimiento almacenado con parámetros. Properties Colección de todos los objetos Property para un objeto determinado (Connection, Command, Recordset). El objeto Property representa una característica dinámica de un objeto ADO definido por el usuario. Errors Colección de todos los objetos Error creados en respuesta a un error único vinculado al proveedor OLE DB. El objeto Error contiene informaciones relativas a un error de acceso a los datos. Fields Colección de todos los objetos Field correspondientes a una columna (o campo) de un objeto Recordset. 7. Los objetos Connection Métodos BeginTrans Empieza una nueva transacción. Cancel Interrumpe y anula la ejecución de una consulta iniciada en modo asíncrono mediante los métodos Execute u Open. Close Cierra una conexión abierta, así como todos los objetos que dependen de ésta. CommitTrans Guarda los cambios efectuados a los datos y detiene la transacción en curso. Execute Ejecuta la consulta, la instrucción SQL, el procedimiento almacenado o el texto propio del proveedor OLE DB. Open Abre una conexión a un origen de datos para poder ejecutar comandos. OpenSchema Obtiene informaciones procedentes del proveedor OLE DB, relativas al esquema de la base de datos. RollbackTrans Anula los cambios realizados a los datos durante la transacción en curso y detiene esta última. Propiedades Attributes Define o devuelve una o varias características de un objeto Connection. El valor por defecto es cero. CommandTimeout Indica el intervalo de espera, en segundos, que debe respetarse al intentar la ejecución de un comando, antes de interrumpir el intento y generar un © Editions ENI – Tous droits réservés – Copie personnelle de jose rodriguez - 5- mensaje de error. El valor por defecto es 30. ConnectionString Define o devuelve la información utilizada para establecer una conexión con el origen de datos. ConnectionTimeout Indica el intervalo de tiempo, en segundos, que debe respetarse al intentar una conexión, antes de abortarla y generar un mensaje de error. El valor por defecto es 15. CursorLocation Define o devuelve el tipo de cursor que debe emplearse por defecto para esta conexión (cursor del lado cliente o cursor del lado servidor). DefaultDatabase Indica la base de datos por defecto de un objeto Connection. IsolationLevel Indica el nivel de aislamiento de un objeto Connection. Mode Indica los permisos de modificación de datos de un objeto Connection. Provider Indica el nombre del proveedor OLE DB del objeto Connection. State Indica si el objeto Connection está abierto o cerrado. Sólo lectura. Version Indica el número de versión ADO. Sólo lectura. Ejemplo Creación de una referencia sobre la base de datos actual. Dim cncPresupuesto as ADODB.Connection Set cncPresupuesto = CurrentProject.Connection Apertura de una base de datos externa. Dim cncPresupuesto as ADODB.Connection cncPresupuesto.Open "Provider=Microsoft.ACE.OLEDB.15.0.;" _ & "Data Source = C:\Presupuesto\Presupuesto.accdb"; Utilización de los métodos CommitTrans y RollbackTrans para confirmar o anular la actualización de registros. Dim cnc As ADODB.Connection Dim strSQL As String Dim strMessage As String ’ Abre la conexión. Set cnc = CurrentProject.Connection ’ Inicio de la transacción cnc.BeginTrans ’ Consultas SQL de actualización strSQL = "UPDATE CLIENTES SET CLI_PAIS = ’España’" _ & "WHERE CLI_CIUDAD = ’Madrid’" cnc.Execute strSQL strSQL = "UPDATE CLIENTES SET CLI_PAIS = ’Francia’" _ & "WHERE CLI_CIUDAD = ’París’" cnc.Execute strSQL - 6- © Editions ENI – Tous droits réservés – Copie personnelle de jose rodriguez ’ Pregunta al usuario si desea validar las actualizaciones If MsgBox("¿Desea confirmar la actualización de los países?", vbYesNo) _ = vbYes Then ’ Guarda los cambios cnc.CommitTrans Else ’ Anula los cambios cnc.RollbackTrans End If 8. Los objetos Command Métodos Cancel Interrumpe y cancela la ejecución de una consulta iniciada en modo asíncrono mediante el método Execute. CreateParameter Crea un nuevo objeto Parameter y especifica sus propiedades. Execute Ejecuta la consulta, la instrucción SQL o el procedimiento almacenado especificado mediante la propiedad CommandText. Propiedades ActiveConnection Indica el objeto Connection al que está asociado el comando. CommandText Contiene el texto del comando que debe enviarse al proveedor OLE DB. CommandTimeout Indica el intervalo de tiempo (en segundos) que debe respetarse al intentar la ejecución del comando, antes de interrumpir el intento y generar un mensaje de error. El valor por defecto es 30. CommandType Indica el tipo del objeto Command. Name Indica el nombre del objeto Command. Prepared Indica si es necesario guardar una versión compilada del comando en el servidor antes de la ejecución. State Indica si el objeto Command está abierto o cerrado. En sólo lectura. Ejemplo Utilización del objeto Command para crear un conjunto de registros. Dim cnc As New ADODB.Connection Dim cmd As New ADODB.Command Dim rst As New ADODB.Recordset ’ Abre la conexión cnc.Open "Provider=Microsoft.ACE.OLEDB.15.0.;" _ & "Data Source = C:\Presupuesto\Presupuesto.accdb;PersistSecurity Info=False" © Editions ENI – Tous droits réservés – Copie personnelle de jose rodriguez - 7- ’ Ejecuta el comando Select Set cmd.ActiveConnection = cnc cmd.CommandType = adCmdText cmd.CommandText = "SELECT * FROM CLIENTES WHERE" _ & " CLI_CIUDAD = ’Madrid’" Set rst = cmd.Execute ’ Muestra el nombre de la empresa ’ en la ventana Inmediato Do While Not rst.EOF Debug.Print rst("CLI_EMPRESA") rst.MoveNext Loop rst.Close cnc.Close 9. Los objetos Recordset Métodos AddNew Crea un nuevo registro para un objeto Recordset que pueda actualizarse. Cancel Cancela la ejecución de una operación Open asíncrona en espera. CancelBatch Cancela una actualización por lotes en espera. CancelUpdate Cancela todas las modificaciones aportadas al registro actual o a un nuevo registro antes de llamar al método Update. Clone Crea un objeto Recordset duplicado a partir de un objeto Recordset existente. Close Cierra el objeto Recordset abierto, así como todos los objetos que dependen de éste. CompareBookmarks Compara dos marcadores y devuelve un valor que indica sus posiciones relativas. Delete Elimina el registro actual o un grupo de registros. Find Busca en un objeto Recordset el registro correspondiente a criterios específicos. GetRows Extrae varios registros de un objeto Recordset y los coloca en una matriz. GetString Devuelve un objeto Recordset en forma de cadena. Move Desplaza la posición del registro actual en un objeto Recordset. MoveFirst Desplaza la posición del registro actual hasta el primer registro del objeto Recordset. MoveLast Desplaza la posición del registro actual hasta el último registro del objeto Recordset. MoveNext Desplaza la posición del registro actual hasta el registro siguiente del objeto Recordset. MovePrevious Desplaza la posición del registro actual hasta el registro anterior del objeto Recordset. NextRecordset Devuelve el conjunto de registros siguiente en el caso de que un comando conlleve varias consultas de selección. - 8- © Editions ENI – Tous droits réservés – Copie personnelle de jose rodriguez Open Abre un cursor que representa los registros de una tabla o los resultados de una consulta. Requery Actualiza los datos de un objeto Recordset volviendo a ejecutar la consulta en la que se basa el objeto. Resync Actualiza los datos del objeto Recordset en curso a partir de la base de datos subyacente. Save Guarda el objeto Recordset en un archivo. Seek Busca en el índice de un objeto Recordset un registro correspondiente a un valor y reemplaza el registro actual por el registro encontrado. Supports Determina si un objeto Recordset soporta un tipo de funcionalidad particular. Update Guarda los cambios aportados al registro actual del objeto Recordset. UpdateBatch Guarda en el disco todas las actualizaciones por lotes en espera. Propiedades AbsolutePage Indica la página del registro actual. AbsolutePosition Indica la posición ordinal del registro actual dentro de un objeto Recordset. ActiveCommand Indica el objeto Command que ha creado el objeto Recordset correspondiente. Sólo lectura. ActiveConnection Indica a qué objeto Connection pertenece el objeto Recordset. BOF Indica si el puntero de registro está posicionado antes del primer registro del objeto Recordset. Sólo lectura. Bookmark Devuelve un marcador que identifica de manera única el registro actual en el objeto Recordset o desplaza el registro actual a un registro identificado por un marcador válido. CacheSize Indica el número de registros de un objeto Recordset almacenado en memoria caché. CursorLocation Define o devuelve el tipo de cursor por defecto para esta conexión (cursor lado cliente o cursor lado servidor). CursorType Indica el tipo de cursor utilizado para este objeto Recordset. DataMember Indica el nombre del miembro de datos que debe extraerse del objeto definido por la propiedad DataSource. Sólo lectura. DataSource Indica que un objeto que contiene datos debe representarse como objeto Recordset. Sólo lectura. EditMode Indica el estado de modificación del registro actual. Sólo lectura. EOF Indica si el puntero de registro está posicionado después del último registro en el objeto Recordset. Sólo lectura. Filter Define un filtro de datos en el Recordset. Index Indica el nombre del índice actual para el Recordset. LockType Indica el tipo de bloqueo de los registros durante las modificaciones. MarshalOptions Indica qué registros se devuelven al servidor. MaxRecords Indica el número máximo de registros que se devuelven a un objeto Recordset desde una misma consulta. El valor por defecto es cero (no hay límite). PageCount Indica el número de páginas de datos contenidas en el objeto Recordset. Sólo lectura. PageSize Indica el número de registros contenidos en una página del Recordset. Properties Referencia a la Colección de los objetos Property del objeto Recordset actual. © Editions ENI – Tous droits réservés – Copie personnelle de jose rodriguez - 9- RecordCount Indica el número de registros en el objeto Recordset. Sólo lectura. Sort Especifica uno o varios nombres de campos según los cuales se ordena el objeto Recordset, y determina el criterio de ordenación de cada campo. Source Indica el origen de los datos de un objeto Recordset. State Indica el estado del Recordset: abierto, cerrado u operación asíncrona en curso. Sólo lectura. Status Indica el estado del registro actual correspondiente a las actualizaciones por lotes u otras operaciones globales. Sólo lectura. StayInSync Indica, en un objeto Recordset jerárquico, si la fila principal debe cambiar cuando cambia el conjunto de los registros secundarios subyacentes. Sólo lectura. Ejemplo Transformación en mayúsculas de los caracteres del campo Cli_Empresa en la tabla Clientes. Dim cnc As New ADODB.Connection Dim rstCli As New ADODB.Recordset ’ Creación del Recordset Set cnc = CurrentProject.Connection rstCli.Open "Select from Clientes", cnc, _ adOpenKeyset, adLockOptimistic ’ Recorrido de los registros With rstCli Do Until .EOF rstCli("Cli_Empresa") = _ UCase(rstCli("Cli_Empresa")) ’ Actualización .Update ’ Registro siguiente .MoveNext Loop End With rstCli.Close cnc.Close Utilización del método Seek: búsqueda de un cliente a partir de su código. Dim cnc As New ADODB.Connection Dim rstCli As New ADODB.Recordset Dim strCodigoCli As String ’ Creación del Recordset Set cnc = CurrentProject.Connection rstCli.Open "Clientes", cnc, adOpenKeyset, _ adLockReadOnly, adCmdTableDirect With rstCli ’ Entrada del código cliente strCodigoCli = _ - 10 - © Editions ENI – Tous droits réservés – Copie personnelle de jose rodriguez InputBox("Introduzca el código cliente") ’ Índice actual: clave primaria .Index = "PrimaryKey" ’ Búsqueda .Seek strCodigoCli, adSeekFirstEQ ’ Registro no encontrado If .EOF Then MsgBox "Cliente no encontrado" Else ’ Registro encontrado MsgBox "Empresa: " & rstCli("Cli_Empresa") End If End With rstCli.Close cnc.Close Utilización del método Find: búsqueda de los clientes cuyo nombre de Empresa empiece por un valor determinado. Dim cnc As New ADODB.Connection Dim rstCli As New ADODB.Recordset Dim strEmp As String Dim strCrit As String Dim bkm As Variant ’ Creación del Recordset Set cnc = CurrentProject.Connection rstCli.Open "Clientes", cnc, adOpenKeyset, _ adLockReadOnly, adCmdTableDirect With rstCli ’ Entrada del código cliente strEmp = InputBox("Introduzca las primeras "_ & "letras de la Empresa") ’ Búsqueda strCrit = "Cli_Empresa Like ’" & strEmp & "%’" .Find strCrit, , adSearchForward ’ Registro no encontrado If .EOF Then MsgBox "Cliente no encontrado" Else ’ Si encuentra: búsqueda de los siguientes Do While Not .EOF MsgBox rstCli("Cli_Empresa") ’ Posición actual bkm = .Bookmark .Find strCrit, 1, adSearchForward, bkm Loop End If End With rstCli.Close cnc.close © Editions ENI – Tous droits réservés – Copie personnelle de jose rodriguez - 11 - 10. La colección Fields Métodos Append Agrega un objeto Field a una colección Fields. Delete Elimina un objeto Field de la colección Fields. Refresh Actualiza los objetos Field en la colección Fields. 11. Los objetos Field Métodos AppendChunk Agrega datos a un objeto Field de tipo binario o de gran tamaño. GetChunk Devuelve todo o parte del contenido de un objeto Field de tipo binario o de gran tamaño. Propiedades ActualSize Indica la longitud del valor de un campo. Sólo lectura. Attributes Indica una o varias características de un objeto Field. DefinedSize Indica el tamaño del objeto Field. Sólo lectura. Name Indica el nombre del objeto Field. NumericScale Indica la escala de los valores numéricos del objeto Field. Sólo lectura. OriginalValue Indica el valor del objeto Field antes de la modificación. Sólo lectura. Precision Indica el grado de precisión de los valores de tipo numérico en el objeto Field. Sólo lectura. Properties Contiene todos los objetos Property de un objeto Field. Type Indica el tipo de datos del objeto Field. UnderlyingValue Indica el valor actual del objeto Field en la base de datos. Sólo lectura. Value Indica el valor del objeto Field. 12. La colección Parameters Métodos Append Agrega un objeto Parameter a la colección Parameters. Delete Elimina un objeto Parameter de la colección Parameters. Refresh Actualiza los objetos Parameter en la colección Parameters. Ejemplo Muestra la lista de todos los campos (nombre y tipo) de la tabla Clientes en la ventana Inmediato. - 12 - © Editions ENI – Tous droits réservés – Copie personnelle de jose rodriguez Dim cnc As New ADODB.Connection Dim rstCli As New ADODB.Recordset Dim fld As ADODB.Field ’ Creación del Recordset Set cnc = CurrentProject.Connection rstCli.Open "Empleados", cnc, adOpenKeyset, adLockReadOnly, _ adCmdTableDirect For Each fld In rstCli.Fields Debug.Print fld.Name & " " & fld.Type Next rstCli.close 13. Los objetos Parameter Métodos AppendChunk Agrega datos a un objeto Parameter de tipo binario o texto de gran tamaño. Propiedades Attributes Indica una o varias características de un objeto Parameter. Direction Indica si el objeto Parameter corresponde a un parámetro de entrada, de salida, o ambos, o si el parámetro es el tipo de retorno de un procedimiento almacenado. Name Indica el nombre del objeto Parameter. NumericScale Indica la escala de los valores numéricos del objeto Parameter. Precision Indica el grado de precisión de los valores de tipo Numeric del objeto Parameter. Properties Contiene todos los objetos Property de un objeto Parameter. Size Indica el tamaño máximo, en bytes o en caracteres, de un objeto Parameter. Type Indica el tipo de datos del objeto Parameter. Value Indica el valor atribuido al objeto Parameter. 14. La colección Properties Métodos Refresh Actualiza los objetos Property en la colección Properties a partir de las informaciones del proveedor. 15. Los objetos Property © Editions ENI – Tous droits réservés – Copie personnelle de jose rodriguez - 13 - Propiedades Attributes Indica una o varias características de un objeto Property. Name Indica el nombre del objeto Property. En sólo lectura. Type Indica el tipo de datos del objeto Property. Value Indica el valor del objeto Property. 16. La colección Errors Métodos Clear Elimina el conjunto de los objetos Error de la colección Errors. Refresh Actualiza los objetos Error a partir de las informaciones del proveedor OLE DB. Propiedades Count Indica el número de objetos Error de la colección Errors. En sólo lectura. Item Permite la indexación de la colección Errors para referenciar a un objeto Error específico. Sólo lectura. 17. Los objetos Error Propiedades Description Devuelve la cadena descriptiva asociada al objeto Error. Sólo lectura. HelpContext Indica el ContextID del archivo de ayuda asociado al objeto Error. Sólo lectura. HelpFile Indica el nombre del archivo de ayuda asociado al objeto Error. Sólo lectura. NativeError Indica el código de error específico del proveedor asociado al objeto Error. Sólo lectura. Number Indica el número que identifica de manera única el error del objeto Error. Sólo lectura. Source Indica el nombre del objeto o de la aplicación que originó el error. Sólo lectura. SQLState Indica el valor devuelto por el proveedor OLE DB. Cadena de cinco caracteres conforme a la norma SQL ANSI. Sólo lectura. - 14 - © Editions ENI – Tous droits réservés – Copie personnelle de jose rodriguez