ASP y ADO

10min

El sistema de acceso a bases datos a través de la web utilizando la tecnología Microsoft, se denomina ADO (ActiveX Data Objects). En esta página le mostramos una breve introducción al mismo, mostrándole sus objetos y métodos más importantes.

Puede encontrar más información sobre el sistema de bases de datos de Microsoft, así como referencia completa a todos los métodos y propiedades de los objetos en la web MSDN.

Índice

Primer paso: Obtener un DSN

Para poder hacer uso de ADO en el establecimiento de una conexión con una base de datos, es recomendable (aunque no necesario) establecer un DSN en el sistema de modo que podamos usarlo para referenciar a dicha base de datos. Esto nos evitará tener que establecer un acceso sin DSN en el que tendríamos que indicar en dicha conexión parámetros como la ruta en disco, nombre de la base de datos, controlador, etc.

En entorno Windows, para acceso a bases de datos SQL Server, el DSN es creado automáticamente por su panel de control, al activar su base de datos SQL Server. Para bases de datos MS Access, deberá usted darlo de alta, desde su panel de control. Tiene los detalles al respecto en cada uno de los apartados correspondientes de esta sección referentes a Access y SQL Server.

Los objetos componentes de ADO

Todo el sistema ADO se basa en una serie de objetos cuyas propiedades y métodos hay que utilizar. Estos objetos están registrados en el sistema, sin embargo no están predefinidos. Es decir, hay que crearlos utilizando Server.CreateObject.

Como valores de muchas de las propiedades de los objetos ADO se utilizan constantes, como adOpenForwardOnly, adOpenKeySet, etc. Todas estas constantes empiezan por ad y están definidas en un archivo llamado adovbs.inc para Visual Basic Script y adojavas.inc para Javascript. Estos archivos los podrá encontrar en su instalación local de ADO (en el disco duro de su ordenador). Para incluirlos en las páginas ASP es necesario utilizar un código de este tipo al comienzo de cada página ASP que use las constantes:

<!--#INCLUDE FILE='adovbs.inc'-->

Para que esta inclusión funcione el archivo adovbs.inc debe estar en el mismo directorio que la página ASP que lo incluye.

Connection

Representa una conexión a una base de datos. Este es el primer objeto que debemos crear para poder conectar con la base de datos.

Propiedades y métodos más relevantes

  • ConnectionString Es una cadena de caracteres con la información necesaria para establecer una conexión con la base de datos. Por tanto, es la propiedad básica de este objeto. Aunque hay hasta 7 argumentos distintos que se pueden suministrar en esta cadena, los básicos son el DSN que identifica al archivo de base de datos y el login y password si existen. Los argumentos se separan con punto y coma.

    Ejemplo:

    'DSN=midsn; UID=milogin; PWD=micontraseña'
  • Open Abre la conexión con la base de datos. Si antes hemos asignado la propiedad ConnectionString, este método no necesita parámetros.
  • Close Cierra la conexión con la base de datos.

    Ejemplo de uso:

    <%
    Set miconexion = Server.CreateObject('ADODB.Connection')
    miconexion.ConnectionString = 'DSN=midsn'
    miconexion.Open
    '.......
    '.......
    miconexion.Close
    %>

Recordset

Este es el objeto ADO más importante ya que es con el que accederemos directamente a los datos de las tablas, tanto para leerlos como para modificarlos.

Un objeto Recordset representa una tabla, que puede ser una tabla física de la base de datos o bien una obtenida mediante una operación como un filtrado o sentencia SQL. En cualquier caso, el objeto representa a la tabla con todos sus registros, aunque sólo uno de ellos es el activo. El registro activo es en el que podemos leer o modificar los valores de los campos. También se le llama cursor.

Propiedades y métodos más importantes

Para una mejor compresión y puesto que son numerosos, los hemos dividido por categorías de utilidad.

  • Propiedades que hacen referencia al origen de los datos: Estas propiedades deben ser asignadas a todo Recordset, pues le dicen la base de datos y la tabla de la que obtener sus datos.
    • ActiveConnection A esta propiedad se le debe asignar un objeto connection que se haya creado previamente. Indicará al Recordset la base de datos en la que buscar su tabla.
    • Source Indica al objeto Recordset la tabla a la que representará. A la propiedad Source se le asigna normalmente una cadena de caracteres con el nombre de la tabla. Sin embargo, también es posible asignarle una sentencia SQL y entonces el objeto Recordset referenciará al resultado de aplicar dicha sentencia.
    • LockType Indica el tipo de bloqueo que se realiza sobre la base de datos. Por defecto toma el valor adLockReadOnly que como su nombre indica sólo sirve para leer datos. Si deseamos editar o añadir registros, tendremos que cambiar esta propiedad por otro valor. El más usado es adLockOptimistic que permite editar la base de datos o añadir registros realizando un bloqueo optimista (sólo cuando sea estrictamente necesario).
    • CursorType El tipo de cursor que se utiliza para recorrer los registros de un recordset. Por defecto toma el valor adOpenForwardOnly que como su nombre indica sólo permite moverse hacia adelante. Por ello si queremos utilizar libremente todos los métodos de movimiento de un recordset (MoveFirst, MoveTo, MoveNext, MovePrevious, etc.) tendremos que cambiar el cursor por uno más potente. Esto puede hacerse asignando a esta propiedad el valor adOpenKeyset.

      Ejemplo:

      Aquí creamos en primer lugar un objeto Connection y luego un Recordset al que se asigna dicho objeto. Usaremos este ejemplo como base para el resto de ejemplos de la página web. En los restantes ejemplos escribiremos sólo el código que iría en lugar de los puntos suspensivos de este script (NOTA: Recuerde que si hay que añadir registros es necesario cambiar el LockType antes de inicializar el recordset).

      <%
      Set miconexion = Server.CreateObject('ADODB.Connection')
      miconexion.ConnectionString = 'DSN=midsn'
      miconexion.Open
      Set mirecordset = Server.CreateObject('ADODB.Recordset')
      mirecordset.ActiveConnection = miconexion
      mirecordset.Source = 'Clientes'
      mirecordset.Open
      ........ ' Operaciones con los datos
      ........' de la tabla Clientes.
      mirecordset.Close
      miconexion.Close
      %>
  • Propiedades que hacen referencia al número de registros:
    • RecordCount Número de registros de la tabla a la que representa el objeto recordset. Ejemplo:
      <h3>Tenemos <%= rstClientes.RecordCount%>
      clientes registrados en nuestra base de datos</h3>
    • EOF Acrónimo de End Of File. Toma el valor TRUE si estamos en el último registro y FALSE en caso contrario. Se usa mucho como condición en bucles while, los cuales se ejecutan hasta llegar al último registro.
    • BOF Acrónimo de Begin Of File. Toma el valor TRUE si estamos en el primer registro y FALSE en caso contrario.
  • Métodos para mover el cursor (registro activo):Estos métodos pueden funcionar todos o no dependiendo del tipo de cursor creado. El tipo de cursor se asigna en la propiedad CursorType. Por ejemplo, para asignar un cursor adOpenKeySet que permita moverse hacia adelante o hacia atrás:
    <%
    Set miconexion = Server.CreateObject('ADODB.Connection')
    miconexion.ConnectionString = 'DSN=midsn'
    miconexion.Open
    Set mirecordset = Server.CreateObject('ADODB.Recordset')
    mirecordset.ActiveConnection = miconexion
    mirecordset.Source = 'Clientes'
    mirecordset.CursorType = adOpenKeySet
    mirecordset.Open
    ........ ' Operaciones con los datos
    ........' de la tabla Clientes.
    mirecordset.Close
    miconexion.Close
    %>

    Nótese que la asignación de propiedades al recordset debe hacerse antes de invocar el método open que es el que lo inicializa con registros.

    • MoveFirst

      Mueve el cursor al primer registro de la tabla.

    • MoveLast

      Mueve el cursor al último registro de la tabla.

    • MoveNext

      Mueve el cursor al siguiente registro.

    • MovePrevious

      Mueve el cursor al registro anterior.

    Ejemplo de un bucle que recorre todos los registros de una tabla:

    <%
    mirecordset.MoveFirst
    do while not mirecordset.EOF
    ..... ' Tratamiento
    ..... ' de datos
    mirecordset.MoveNext
    loop
    %>
  • Lectura y modificación de los campos del registro activoLa sintaxis para acceder a los datos de un campo del registro activo de un recordset es
    mirecordset ('Domicilio')

    Esto se usa tanto para leer como para asignar valores. En nuestro ejemplo, el objeto mirecordset representa a una tabla uno de cuyos campos tiene el nombre «Domicilio». Así, con la expresión

    dom = mirecordset('Domicilio')

    Leemos el valor del campo domicilio del registro activo y se lo asignamos a la variable dom. Con la expresión

    mirecordset('Domicilio') = 'C/ Bretón de los Herreros 19, 1º M'
    mirecordset.Update

    asignamos un valor al campo Domicilio del registro activo. Tras la edición del registro, es necesario llamar al método Update. El motivo es que los cambios en el registro activo se realizan sobre un buffer (espacio de almacenamiento intermedio) y no sobre el registro propiamente dicho.

    Ejemplo:

    El recordset rstClientes representa a nuestra tabla de clientes que, entre otros, tiene los campos Provincia e IVA . El siguiente bucle recorre todos los clientes, comprueba su provincia y le asigna el IVA correspondiente: 0 para Canarias y 16 para los demás.

    <%
    rstClientes.MoveFirst
    do while not rstClientes.EOF
     if rstClientes('Provincia') = 'Las Palmas' or
     rstClientes('Provincia') = 'Tenerife' Then
        rstClientes('IVA') = 0
     else
        rstClientes('IVA') = 16
     end if
     rstClientes.Update
     rstClientes.MoveNext
    loop
    %>
  • Métodos para agregar o eliminar registros de la tabla:
    • Delete Elimina el registro activo. Por ejemplo, este bucle elimina todos los clientes morosos de nuestra base de datos:
      <%
      rstClientes.MoveFirst
      do while not rstClientes.EOF
       if rstClientes('Deuda') > 0 Then
         rstClientes.Delete
       end if
       rstClientes.MoveNext
      loop
      %>
    • AddNew y Update Crear un nuevo registro involucra dos métodos. Primero AddNew crea un nuevo registro en blanco. Después asignamos valores a los distintos campos del registro. Por último invocamos el método Update para que se haga efectiva la incorporación del nuevo registro con los valores asignados.

      En este ejemplo incorporamos un nuevo cliente a nuestra base de datos:

      <%
      rstClientes.AddNew
      rstClientes('Nombre') = 'Pepe Gotera'
      rstClientes('Direccion') = 'Rue del Percebe, 13'
      rstClientes('Localidad') = 'Sildavia'
      rstClientes('Profesion') = 'Chapuzas a domicilio'
      rsClientes.Update
      %>

      Recuerde que para que esto funcione hay que asignar un tipo de bloqueo que permita la edición de la base de datos. Esto se hace asignando a la propiedad LockType del recordset uno de estos valores: adLockOptimistic, adLockPessimistic o adLockBatchOptimistic.

Command

Este objeto es la representación de un comando que se envía a la base de datos. Este comando puede ser una de estas 3 cosas:

  • Llamada a un procedimiento guardado en la base de datos.
  • El texto de una sentencia SQL.
  • El nombre de una tabla.

Propiedades y métodos más relevantes

  • ActiveConnectionEs una referencia al objeto connection que enlaza con la base de datos. Es imprescindible asignar esta propiedad antes de invocar el método command.execute para ejecutar el comando.
  • CommandTextEste es el texto del comando. Si se trata de una consulta SQL (lo habitual), esta propiedad es simplemente una cadena con el texto de la consulta.
  • ExecuteEl método que ejecuta la consulta. El resultado de la ejecución del comando normalmente será un recordset.

    En el siguiente ejemplo, obtenemos un recorset con un filtrado de la tabla Clientes en el que se toma sólo aquellos clientes cuya provincia es Navarra:

    <%
    Set miconexion = Server.CreateObject('ADODB.Connection')
    miconexion.ConnectionString = 'DSN=midsn'
    miconexion.Open
    Set SqlCommand = Server.CreateObject('ADODB.Command')
    SqlCommand.ActiveConnection = miconexion
    SqlCommand.CommandText =
    'SELECT * FROM Clientes WHERE Provincia = 'Navarra''
    Set rstNavarros = SqlCommand.execute
    ' .......
    '........
    miconexion.Close
    %>
Fernán García de Zúñiga

Productos relacionados: