Bases de datos en la Web

El sistema de acceso a bases datos a trav�s de la web utilizando la tecnolog�a Microsoft, se denomina ADO (ActiveX Data Objects). Aqu� se expone una introducci�n comprensiva en castellano. Para ver una completa referencia acerca de todo el sistema de bases de datos de Microsoft, consulte en www.microsoft.com/data. La referencia completa de m�todos y propiedades de los objetos est� tambi�n en la biblioteca online de MSDN (msdn.microsoft.com). Ah� ver� m�ltiples ejemplos en los que comprobar� la flexibilidad del sistema ADO (al mismo resultado se puede llegar por v�as distintas). Por motivos pedag�gicos, aqu� se expone una utilizaci�n m�s r�gida.

.�Terminolog�a

ADO: ActiveX Data Objects. Es una familia de objetos componentes dedicados a facilitar el acceso a bases de datos. El ProgID de cada uno de ellos se forma combinando ADODB. con el nombre del objeto (por ejemplo ADODB.Recordset, ADODB.Connection, ADODB.Command, etc). Por tanto, en VBScript los objetos se crean con sentencias tipo Set mirst = Server.CreateObject("ADODB.Recordset"), etc

.�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. 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. Tanto el objeto ADO que nos permite acceder a los datos (Recordset) como el que nos permite realizar consultas (Command) disponen de una propiedad llamada ActiveConnection que es una referencia al objeto connection que enlaza con la base de datos a la que queremos atacar. De ah� que el primer paso sea crear la conexi�n.

.�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 fuente 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 dos propiedades deben ser asignadas a todo Recordset, pues le dicen la base de datos y la tabla de la que obtener sus datos.

ActiveConnection

Como se ha comentado antes 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. Este ejemplo es una especie de esqueleto para los dem�s que sigan: Se supone que debe hacerse algo parecido a esto para abrir el Recordset. Es decir, en los restantes ejemplos escribimos s�lo el c�digo que ir�a en el 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. Vale TRUE si estamos en el �ltimo registro y FALSE si no. 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. Vale TRUE si estamos en el primer registro y FALSE si no.

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 activo

La 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 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

Eliminar el registro activo es muy f�cil. Basta con invocar este m�todo. 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.

ActiveConnection

Es 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.

CommandText

Este 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.

Execute

El m�todo que ejecuta la consulta. El resultado de la ejecuci�n del comando normalmente ser� un recordset.

En el 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 
%>

.�Nuestro Ejemplo

En nuestro ejemplo vamos a usar el script bd.asp, PWS y la base de datos Ejemplo1 en formato Access.

Como casi todos los script que vamos a desarrollar en este turorial, primero nos presenta el estado actual de la tabla Clientes y un formulario para a�adir un nuevo registro en la BD.

Tambi�n hemos explicado en este cap�tulo como borrar y moverse por el recordset, pero en el ejemplo no lo usamos porque la mayor�a de las veces el cliente s�lo debe poder ver y a�adir registros a la base de datos, y no modificarlos y / o borrarlos.

Llamando al scripts desde el browser cliente con http://127.1.1.1/sie/asp/bd.asp debe aparecernos algo parecido a esto:

Pantalla de ejemplo

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP