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: