ASP - Acceso a Base de datos Access

Written by lopezatienza on 29 Octubre 2008 – 10:49 -


ACCESO A BASES DE DATOS

1.CREAR UNA BASE DE DATOS USANDO MICROSOFT ACCESS 2000
2.COMUNICACIÓN CON BASES DE DATOS. COMPONENTES ADO

Creación de un DSN de sistema
El objeto CONNECTION
El objeto RECORDSET
El objeto COMMAND
3.INSTRUCCIONES SQL PARA CONSULTAR DATOS
La cláusula WHERE
La cláusula ORDER BY

ACCESO A BASES DE DATOS
La característica más útil de ASP es la capacidad de una página ASP para interactuar fácilmente con una base de datos. Mediante una página ASP podemos realizar las cuatro operaciones posibles sobre una base de datos:

recuperar datos, insertar datos, actualizar datos existentes o borrar datos existentes.

Existen muchos programas comerciales de bases de datos, como Access y SQL Server de Microsoft, Oracle, FoxPro, etc. Debido a que cada sistema de base de datos puede requerir una sintaxis diferente para tener acceso a los datos, Microsoft decidió crear un estándar. Este estándar, conocido como ODBC (Open Database Conectivity - Conectividad Abierta de Bases de Datos), proporciona una interfaz común hacia una base de datos para que funcione el mismo segmento de código sin tomar en cuenta la base de datos que se está consultando.

Las bases de datos que soportan este estándar se conocen como apegadas a ODBC, y entre ellas se encuentra
Access.

1.CREAR UNA BASE DE DATOS USANDO MICROSOFT ACCESS 2000

Toda base de datos utiliza tablas para guardar la información. Una tabla es una combinación de filas (registros) y columnas (campos), en la que cada columna describe las propiedades de un objeto y cada fila es una instancia única del objeto.

Ejemplo: una tabla de coches en la que cada fila se corresponde con un modelo y cada columna especifica las
características del modelo como color, fabricante, fecha de fabricación, etc.

Actualmente las bases de datos que se utilizan son relacionales. Cada tabla representa un objeto, y se relacionan unas con otras mediante identificadores con el fin de no repetir la información innecesariamente.

Para aprender cómo crear una base de datos con Access utilizaremos un ejemplo. Una base de datos que contiene una tabla de empleados con los siguientes campos: (A lo largo del manual se irá completando la base de datos con nuevas tablas. Esta base de datos no se proporciona junto con los archivos de ejemplo, debe crearla el alumnado)

-NombreEmpleado.
-NumeroEmpleado.
-CantidadGastos.
-RazonGastos.

En primer lugar arrancamos Access. Aparecerá el siguiente cuadro de diálogo, en el cual seleccionaremos "Base de datos de Access en blanco" para crear nuestra nueva base de datos:

A través de un nuevo cuadro de diálogo se nos pide un nombre de archivo para la base de datos y su ubicación. Llamaremos Empresa.mdb a la nueva base de datos y la ubicaremos en algún lugar del servidor web.

Cuando pulsemos en "Crear", estaremos viendo la base de datos vacía, con tres opciones para el apartado de tablas: "Crear una tabla en vista Diseño", "Crear una tabla utilizando el asistente", "Crear una tabla introduciendo datos". Crearemos la tabla de clientes utilizando la vista Diseño.

Aparece una nueva tabla que nos va a permitir definir los campos (las columnas) que van a componer nuestra tabla de empleados: nombre, tipo de datos y descripción:

Los tipos de datos que podemos utilizar en Access son:

- Texto: datos alfanuméricos hasta 255 caracteres.
- Memo: datos alfanuméricos hasta 65.535 caracteres.
- Numérico: datos numéricos.
- Fecha/Hora: datos de fecha y hora.
- Moneda: valores monetarios hasta 4 decimales.
- Sí/No: datos de tipo booleano.
- Autonumérico: entero largo, único para cada nuevo registro, generado por Access.
- Objeto OLE: imágenes, gráficos u objetos de otras aplicaciones de Windows.
- Hipervínculo: enlace a una página web o a otra sección de la base de datos.
- Asistente para búsquedas...: muestra una lista para facilitar la introducción de datos.

Una vez creada la tabla la guardamos. Al guardarla se nos solicita un nombre para la tabla, la llamaremos "Empleados", y al cerrarla Access nos avisa de que no hemos definido ninguna clave principal. Esta clave es el campo que identifica de forma única cada registro para luego relacionar esta tabla con otras (por ejemplo el número del empleado). De momento no crearemos una clave principal.

Para introducir datos en la tabla, hacemos doble clic sobre el nombre de la tabla y aparecerá una nueva ventana con las filas y columnas correspondientes a la tabla "Empleados".

2.COMUNICACIÓN CON BASES DE DATOS. COMPONENTES ADO

Conforme desarrollemos páginas ASP, parte del código que necesitaremos ya habrá sido escrito y
empaquetado en un componente.

Nosotros utilizaremos componentes ActivX. ActivX es un término que hace referencia a un conjunto de tecnologías independientes de las aplicaciones y su lenguaje, que permiten que los componentes de software escritos en diferentes lenguajes funcionen juntos en entornos de red.

Los componentes ActivX pueden aplicarse tanto en el lado del cliente como en el lado del servidor. Algunos son gratuitos y los podemos encontrar en Internet, otros ya han sido incluidos por Microsoft en el IIS y otros se venden. Suelen encontrarse bajo archivos de extensión OCX o DLL.

Para poder utilizar un componente ActivX es necesario instalarlo en la máquina sobre la que se va a ejecutar. Una vez instalados, podremos utilizar estos objetos creando una instancia del objeto ActivX y así tener acceso a sus propiedades y métodos:

Dim objeto
Set objeto = Server.CreateObject("Clase.Componente")
Existen componentes ActivX para tareas muy diversas:
AdRotator para la inserción de publicidad rotatoria en un banner que cambia al azar.
Browser Capabilities para conocer características del navegador que está utilizando el cliente.
FileSystemObject para acceder a ficheros en el servidor.
ActivX Data Object (ADO) para acceder a bases de datos.

Para comunicarnos con una base de datos mediante una página ASP necesitamos utilizar los componentes ADO (Objetos de Datos ActivX), que vienen con ASP. El modelo ADO contiene varios objetos organizados de forma jerárquica, cada uno de ellos con sus propiedades y métodos asociados:

- Connection: establece la conexión con el origen de datos.
- Recordset: permite trabajar con los datos de una tabla.
- Command: proporciona otra forma de crear un objeto Recordset mediante un comando SQL.
- Error: representa un error generado por el origen de datos.
- Field: representa una columna de la tabla.
- Parameter: contiene todos los parámetros que necesitan los comandos.

El componente ADO utiliza el estándar ODBC para el acceso a bases de datos, permitiendo que las aplicaciones accedan a los datos a través del lenguaje SQL, independientemente de la tecnología que utilicen.

Para establecer una conexión con una base de datos podemos utilizar una cadena de consulta, que especifique el programa de base de datos que vamos a utilizar y la ubicación física de la base de datos en el disco, o bien configurar una fuente de datos a través de la ventana ODBC del Panel de Control para crear un DSN.

CREACIÓN DE UN DSN DE SISTEMA

El DSN (Data Source Name - Nombre de Origen de Datos) es un archivo que contiene información acerca de la base de datos, como el lugar donde se encuentra y el tipo de base de datos de que se trata. Es un identificador único de la base de datos en el sistema.

Una vez creado el DSN, es todo lo que necesitamos conocer sobre la base de datos para abrirla, modificarla, consultarla, etc. desde una página ASP.

Para crear un DSN seguiremos estos pasos:

1.- Acceder a Inicio|Configuración|Panel de Control|Herramientas administrativas|Orígenes de datos (ODBC).
2.- Seleccionar la ficha "DSN de sistema".
3.- Hacer clic sobre "Agregar" para crear un nuevo DSN.
4.- Seleccionar Microsoft Access Driver (*.mdb) de la lista de controladores y hacer clic en "Finalizar".
5.- En el cuadro de especificaciones "Configuración de ODBC Microsoft Access" especificar el nombre que usaremos para hacer referencia a la base de datos en las páginas ASP en el cuadro "Nombre del origen de datos" (Empresa.dsn).
6.- Hacer clic en "Seleccionar..." para especificar la ruta física de la base de datos y Aceptar.

EL OBJETO CONNECTION

Es el objeto primario del modelo ADO, el que se encuentra en la parte más alta de la jerarquía. El resto de objetos de ADO no puede existir si el objeto Connection no es antes declarado. Tanto el objeto Recordset como el objeto Command tienen la propiedad ActiveConnection que hace referencia al objeto Connection.

Antes de trabajar con una base de datos debemos conectarnos a ella. Para establecer esta conexión se utiliza el objeto Connection, que representa una conexión a una base de datos desde una página ASP.

En primer lugar creamos una instancia del objeto, de forma explícita se crea de la siguiente forma:

<%Dim conexion%>
<%Set conexion= Server.CreateObject("ADODB.Connection")%>

Todos los componentes ADO tienen identificador único "ADODB.Componente".

En segundo lugar establecemos la conexión mediante las propiedades y métodos del objeto.

Propiedades

ConnectionString: especifica la base de datos con la que queremos conectar mediante una cadena de texto.

Esta cadena puede contener hasta 7 argumentos separados por punto y coma (;), aunque los más importantes son el DSN, y el nombre de usuario y la contraseña si la base de datos los requiere.

Ejemplo:

<% conexion.ConnectionStrirng="DSN=Empresa.dsn;User=usuario;Password=contraseña"%>

Si en lugar de un DSN de sistema quisiéramos utilizar una cadena para especificar la información sobre la base de datos, lo haríamos de la siguiente forma:

<%conexion.ConnectionString="DRIVER={Microsoft Access Driver (*.mdb)};DBQ=UNIDAD:\ruta\Empresa.mdb"%>

En lugar de utilizar la propiedad ConnectionString, podemos pasar la cadena con la información de conexión en el método Open. De esta forma crearíamos el objeto Connection de forma implícita.

Ejemplo:

<% conexion.Open Empresa.dsn, usuario, contraseña %>

Mode: especifica el modo de conexión que se va a establecer. Algunos de los valores que puede tomar son: 1 para sólo lectura, 2 para sólo escritura, 3 para lectura y escritura.

Ejemplo:

<% conexion.Mode=1 %>

Métodos

Open: abre la conexión con la base de datos. Si antes hemos asignado la propiedad ConnectionString, este método no necesita parámetros.

Ejemplo:

<% conexion.open %>

Close: cierra la conexión con la base de datos.

Ejemplo:

<% conexion.close %>

Execute: crea implícitamente un objeto Recordset, ejecutando una sentencia SQL contra la base de datos.

Ejemplo.- si vamos a trabajar con la tabla "Empleados":

<% Set rs = conexion.Execute(SELECT * FROM Empleados) %>

La estructura general de apertura y cierre de una conexión con una base de datos quedaría como sigue:

<% Dim conexion Set conexion = Server.CreateObject("ADODB.Connection")
conexion.ConnectionString = "DSN=Empresa.dsn"
conexion.Open
...
conexion.Close
%>
Una vez cerrada la conexión debemos liberar la memoria asociada al objeto que representa dicha conexión:
<%
...
conexion.Close
Set conexion=Nothing
%>

EL OBJETO RECORDSET

Este objeto es el componente ADO más importante, ya que a través de él podremos acceder a los datos de las tablas de la base de datos.

El objeto Recordset representa un conjunto de registros. Puede utilizarse para contener una tabla completa, con todos sus registros, o un subconjunto de los registros de una tabla obtenidos después de realizar un filtrado.

Dentro de los registros que forman parte del Recordset, solamente uno de ellos será el activo.

Al igual que con el resto de componentes ADO, lo primero que debemos hacer es crear una instancia del objeto Recordset, de forma explícita o implícita. De forma explícita sería:

<%Dim rs%>
<%Set rs= Server.CreateObject("ADODB.Recordset")%>

Propiedades

ActiveConnection: es un objeto Connection o una cadena que contiene la información de conexión. Si se usa una cadena, ésta debe contener toda la información que iría en la propiedad ConnectionString del objeto Connection, creando así el objeto Connection de forma implícita. Es decir, indica al Recordset la base de datos en la que buscar la tabla.

Ejemplo:

<% rs.ActiveConnection=conexion %>

Source: es la tabla a la cual representará el Recordset. Puede ser un nombre de una tabla o una sentencia SQL de filtrado de una tabla.

Ejemplo:

<% rs.Source = "Empleados" %>

Para hacer referencia a un campo en concreto, del registro activo del Recordset, utilizaremos la siguiente
sintaxis:

nombre_recordset("nombre_campo")

Ejemplo:

<%= rs("NombreEmpleado") %>

LockType: especifica si se puede escribir en la tabla y de qué forma. Debido a que varios usuarios pueden tener acceso a la tabla al mismo tiempo, es conveniente bloquear el registro activo con el fin de evitar que dos o más clientes modifiquen un mismo registro a la vez. Cuando un usuario bloquea un registro, ningún otro usuario puede modificar el contenido de ese registro hasta que el usuario que lo bloqueó lo desbloquee. Para especificar el tipo de bloqueo que queremos utilizar disponemos de las siguientes constantes:

- adLockReadOnly (bloqueo de sólo lectura): es el tipo de bloqueo por defecto y su valor es 1. Indica que los registros son de sólo lectura, no se pueden modificar ni añadir nuevos registros. Debemos utilizarlo cuando solamente pretendemos leer los valores de los campos de los registros que ya existen.

- adLockPessimistic (bloqueo pesimista): su valor es 2. Los registros se bloquean durante toda la conexión de un usuario a una tabla. Se utiliza cuando se espera que tengan lugar muchas actualizaciones simultáneas para asegurar la integridad de los datos.

- adLockOptimistic (bloqueo optimista): su valor es 3. Sólo se bloquean los registros en el momento en el que el usuario los actualiza (mediante el método Update). Es el que se emplea con más frecuencia, y se debe utilizar cuando no se espera que se produzcan muchas actualizaciones simultáneas.

Ejemplo:

<% rs.LockType = adLockOptimistic %>

CursorType: indica cómo queremos movernos por el Recordset y controla la forma en que los cambios que hacen otros usuarios afectan a la tabla que se está viendo. Para especificar el tipo de cursor que queremos utilizar disponemos de las siguientes constantes:

- adOpenForwardOnly: es el tipo de cursor por defecto y su valor es 0. Sólo nos permite movernos a los registros posteriores al actual y no muestra al usuario los cambios realizados en la tabla por otros usuarios. Es el tipo de cursor más eficiente, sin embargo, muchos métodos y propiedades del objeto Recordset no se pueden usar cuando se abren con un cursor sólo hacia delante.

- adOpenKeyset: su valor es 1. Nos permite movernos por los registros en los dos sentidos y ver los cambios realizados por otros usuarios. Sin embargo, no veremos la incorporación de nuevos registros.

- adOpenDynamic: su valor es 2. Nos permite movernos por los registros en los dos sentidos, ver los cambios realizados por otros usuarios, así como los nuevos registros que hayan sido añadidos a la tabla por otro Recordset.

- adOpenStatic: su valor es 3. También nos permite movernos en los dos sentidos, aunque no veremos reflejados en la tabla los cambios realizados por otros usuarios ni los nuevos registros.

Microsoft Access no soporta el cursor dinámico. Si intentamos crear un Recordset con un cursor dinámico, Access establecerá automáticamente CursorType a un cursor keyset.

Ejemplo:

<% rs.CursorType = adOpenStatic %>

La estructura general de apertura y cierre de una conexión con una tabla de una base de datos, que
solamente pretendemos leer, quedaría como sigue:

<%
Dim conexion,rs
Set conexion = Server.CreateObject("ADODB.Connection")
conexion.ConnectionString = "DSN=Empresa.dsn"
conexion.Open
Set rs = Server.CreateObjet("ADODB.Recordset")
rs.ActiveConnection = conexion
rs.Source = "Empleados"
rs.Open
...
...
rs.Close
Set rs=Nothing
conexion.Close
Set conexion=Nothing
%>

En el caso del objeto Recordset también es conveniente liberar la memoria que tiene asignada, asignándole Nothing como valor.

RecordCount: hace referencia al número de registros que contiene la tabla a la cual representa el Recordset.

Ejemplo:

Número total de empleados: <% Response.Write rs.RecordCount %>.

BOF (Begin Of File): es un valor booleano. Su valor será True cuando nos encontremos al inicio del Recordset.
EOF(End Of File): es un valor booleano. Su valor será True cuando nos encontremos al final del Recordset.
Estas dos propiedades suelen utilizarse en bucles, para recorrer los registros de la tabla.

Métodos

MoveNext: avanza hacia el siguiente registro del Recordset.
MovePrevius: mueve el cursor al registro anterior. No será válido si el Recordset está establecido para
movimiento sólo hacia delante.
MoveFirst: se mueve hacia el primer registro del Recordset. Puede usarse aunque el movimiento esté
establecido sólo hacia delante.
MoveLast: va directamente al último registro del Recordset.
Move n: avanza n registros a partir del actual. Podemos especificar una cantidad de registros negativa para movernos hacia atrás, siempre que el tipo de cursor no sea adOpenForwardOnly.

Ejemplo, para recorrer todos los registro de una tabla:

<%
rs.MoveFirst
Do While NOT rs.EOF
...
...
rs.MoveNext
Loop
%>

Veamos un ejemplo de cómo mostrar el contenido de una tabla de Access en una tabla HTML. En primer lugar, introducimos algunos datos en la tabla "Empleados" de la base de datos "Empresa.mdb":

En segundo lugar creamos el archivo ASP tablaEmpleados.asp:

<% @LANGUAGE=VBScript %>
<% Option Explicit %>
<HTML>
<BODY TEXT=BLUE>
<H1 ALIGN=CENTER>CANTIDAD DE GASTOS POR EMPLEADO</H1>
<%
Dim conexion,rs
Set conexion = Server.CreateObject("ADODB.Connection")
conexion.ConnectionString = "DSN=Empresa.dsn"
conexion.Open
Set rs = Server.CreateObject("ADODB.Recordset")
rs.ActiveConnection = conexion
rs.Source = "Empleados"
'aquí indicaríamos el tipo de bloqueo
'y el tipo de cursor
'dejamos los valores por defecto adLockReadOnly - adOpenForwardOnly
rs.Open
%>
<TABLE BORDER ALIGN=CENTER>
<TR>
<TH>NOMBRE
<TH>EMPLEADO
<TH>CANTIDAD
<TH>RAZÓN
<%
Do While NOT rs.EOF
Response.Write "<TR><TD>" & rs("NombreEmpleado")
Response.Write "<TD>" & rs("NumeroEmpleado")
Response.Write "<TD>" & rs("CantidadGastos")
Response.Write "<TD>" & rs("RazonGastos")
rs.MoveNext
Loop
rs.Close
Set rs=Nothing
conexion.Close
Set conexion=Nothing
%>
</TABLE>
</BODY>
</HTML>

Otra posibilidad consiste en mostrar al usuario una serie de opciones, guardadas en una tabla de la base de datos, mediante una lista desplegable. Veamos un ejemplo. En primer lugar creamos la tabla "Envio" en la base de datos "Empresa" con dos campos, uno autonumérico y otro de texto:

En segundo lugar escribimos el código de la página ASP listaEnvio.asp:

<% @LANGUAGE=VBScript %>
<% Option Explicit %>
<HTML>
<BODY TEXT=BLUE>
<H3>Elija el método de envío</H3>
<FORM ACTION="ProcesaOrden.asp" METHOD=POST>
<SELECT NAME=lista>
<%
Dim conexion,rs
Set conexion = Server.CreateObject("ADODB.Connection")
conexion.ConnectionString = "DSN=Empresa.dsn"
conexion.Open
Set rs = Server.CreateObject("ADODB.Recordset")
rs.ActiveConnection = conexion
rs.Source = "Envio"
rs.Open
Do While NOT rs.EOF
Response.Write "<OPTION VALUE='" & rs("CodigoEnvio") &"'>"
Response.Write rs("Descripcion")
rs.MoveNext
Loop
rs.Close
Set rs=Nothing
conexion.Close
Set conexion=Nothing
%>
</SELECT>
<P>
<INPUT TYPE=SUBMIT VALUE=Enviar>
</FORM>
</BODY>
</HTML>

Delete: elimina el registro actual, el registro activo.
AddNew: crea un nuevo registro en el Recordset. El nuevo registro no se añade a la base de datos     hasta que se llama al método Update. Después de que se ejecuta AddNew, el nuevo registro se convierte en el registro activo, y lo sigue siendo después de que se llama a Update.

Tras crear el nuevo registro, debemos asignar los valores a los distintos campos del registro antes de actualizar con Update. Para ello podemos utilizar el operador de asignación, o la siguiente sintaxis:

nombre_Recordset.AddNew campos, valores Donde campos y valores pueden ser matrices con la misma cantidad de elementos.

Ejemplo:

<% rs.AddNew "Nombre" "Apellido", "Luis" "García" %>
o bien
<% rs.AddNew Array("Nombre", "Apellido"), Array("Luis", "García") %>

Update: se invoca tras haber añadido un nuevo registro o haber realizado modificaciones en registros ya existentes, para que los cambios sean efectivos.

El archivo adovbs.inc Las constantes que especifican el tipo de cursor (CursorType) y el tipo de bloqueo (LockType) del Recordset no están integradas en ASP. Es decir, para poder utilizarlas es necesario definirlas antes. Podemos definirlas cada vez que las utilicemos o bien incluir el archivo "adovbs.inc", el cual contiene todas las definiciones de las constantes ADO.
Este archivo viene con IIS y PWS, y está instalado en "Archivos de Programa\Archivos
Comunes\System\ado". Para incluirlo en cualquier página en la que usemos las constantes, debemos copiarlo en el directorio raíz de nuestro sitio web e insertar la línea <!--#include virtual="/adovbs.inc"--> en la página ASP correspondiente.

Veamos un ejemplo en el cual los usuarios se registran en nuestra base de datos a través de un formulario.

Para ello necesitamos dos páginas, una que contenga el formulario en el que el usuario introduce su información, y otra página a la cual el formulario pasa la información para introducirla en la base de datos.

En primer lugar crearemos una nueva tabla, "Usuarios", en la base de datos "Empresa.mdb" con los campos "Nombre", "Apellido", "CorreoE", "Usuario", "Contraseña":

En segundo lugar creamos la página "Registro.html" que contendrá el formulario. Antes de enviar los datos a la página ASP, comprobaremos en el cliente (mediante JavaScript) si el usuario ha facilitado todos los datos:
(Esta página no se proporciona junto con los archivos de ejemplo, debe crearla el alumno)

En tercer lugar creamos la página "RegistroUsuario.asp", que antes de añadir el nuevo registro a la tabla "Usuarios", comprobará si el cliente ha especificado un nombre de usuario que ya está siendo utilizado por otro cliente:

RegistroUsuario.asp

<%@ LANGUAGE=VBScript %>
<% Option Explicit %>
<!--#include virtual="/adovbs.inc"-->
<HTML>
<BODY TEXT=BLUE>
<%
Dim conexion,rs,existe
existe=False
Set conexion=Server.CreateObject("ADODB.Connection")
conexion.ConnectionString="DSN=Empresa.dsn"
conexion.Open
Set rs=Server.CreateObject("ADODB.Recordset")
rs.ActiveConnection=conexion
rs.Source="Usuarios"
rs.LockType=adLockOptimistic
rs.Open
Do While NOT (rs.EOF OR existe)
If (StrComp(rs("Usuario"),Request.Form("Usuario"),1)=0) Then
Response.Write "El nombre de usuario " & Request.Form("Usuario") & " ya existe"
Response.Write "<BR> <A href='Registro.html'>Volver a formulario de registro</A>"
existe=True
End If
rs.MoveNext
Loop
If NOT existe Then
rs.AddNew
rs("Nombre")=Request.Form("Nombre")
rs("Apellido")=Request.Form("Apellido")
rs("CorreoE")=Request.Form("CorreoE")
rs("Usuario")=Request.Form("Usuario")
rs("Contrasenia")=Request.Form("Contrasenia")
rs.Update
Response.Write "<H2>Gracias por registrarse</H2>"
End If
rs.Close
Set rs=Nothing
conexion.Close
Set conexion=Nothing
%>
</BODY>
</HTML>

Veamos ahora un ejemplo de formulario que permite al usuario que ya está registrado modificar sus datos.

Para ello necesitaremos una página de inicio de sesión, en la cual el usuario proporcionará su nombre de usuario y su contraseña ("inicioSesion.html"). En segundo lugar, mostraremos al usuario todos sus datos a través de un formulario "datosUsuario.asp", en el cual podrá cambiar los valores de los campos. Y finalmente enviaremos estos nuevos datos a la página "cambiarDatos.asp", que se encargará de actualizar el registro correspondiente.

"inicioSesion.html" (Esta página no se proporciona junto con los archivos de ejemplo, debe crearla el alumno):

Cuando el usuario se conecta, envía los datos a la página "datosUsuario.asp", que se encargará de buscar al usuario en la base de datos, comprobar si ha escrito su contraseña correctamente y mostrarle los datos que están grabados actualmente en la base de datos:

<%@ LANGUAGE=VBScript %>
<% Option Explicit %>
<!--#include virtual="/adovbs.inc"-->
<HTML>
<HEAD>
<TITLE>Datos de Usuario</TITLE>
<SCRIPT LANGUAGE=JAVASCRIPT>
function validar(formulario){
if (formulario.Nombre.value==""){
alert("No ha introducido su nombre")
formulario.Nombre.focus()
return false
}
if (formulario.Apellido.value==""){
alert("No ha introducido su apellido")
formulario.Apellido.focus()
return false
}
if (formulario.CorreoE.value==""){
alert("No ha introducido su correo")
formulario.CorreoE.focus()
return false
}
if (formulario.Usuario.value==""){
alert("Debe especificar un nombre de usuario")
formulario.Usuario.focus()
return false
}
if (formulario.Contrasenia.value==""){
alert("Debe especificar una contraseña")
formulario.Contrasenia.focus()
return false
}
return true
}
</SCRIPT>
</HEAD>
<BODY TEXT=BLUE>
<%
Dim conexion,rs,encontrado
encontrado=False
Set conexion=Server.CreateObject("ADODB.Connection")
conexion.ConnectionString="DSN=Empresa.dsn"
conexion.Open
Set rs=Server.CreateObject("ADODB.Recordset")
rs.ActiveConnection=conexion
rs.Source="Usuarios"
rs.LockType=adLockOptimistic
rs.Open
Do While NOT (rs.EOF OR encontrado)
If (StrComp(rs("Usuario"),Request.Form("Usuario"),1)=0) Then
encontrado=True
Else
rs.MoveNext
End If
Loop
If NOT encontrado Then
rs.Close
Set rs=Nothing
conexion.Close
Set conexion=Nothing
Response.Write "<H2>Usuario no registrado</H2>"
Response.Write "<A href='Registro.html'>Registrarse</A> "
Response.Write "<A href='inicioSesion.html'>Volver a Inicio de Sesión</A>"
Response.End
End If
If NOT (StrComp(rs("Contrasenia"),Request.Form("Contrasenia"),1)=0) Then
rs.Close
Set rs=Nothing
conexion.Close
Set conexion=Nothing
Response.Write "<H2>Contraseña incorrecta</H2>"
Response.Write "<A href='inicioSesion.html'>Volver a Inicio de Sesión</A>"
Response.End
End If
%>
<H2>Estos son sus datos. Si lo desea, puede modificarlos, excepto su nombre de usuario</H2>
<FORM ACTION="cambiarDatos.asp" METHOD=POST ="return validar(this)">
<TABLE>
<TR>
<TD ALIGN=RIGHT>Nombre:
<TD><INPUT TYPE=TEXT SIZE=30 NAME=Nombre VALUE=<%=rs("Nombre")%>>
<TR>
<TD ALIGN=RIGHT>Primer Apellido:
<TD><INPUT TYPE=TEXT SIZE=30 NAME=Apellido VALUE=<%=rs("Apellido")%>>
<TR>
<TD ALIGN=RIGHT>Correo Electrónico:
<TD><INPUT TYPE=TEXT SIZE=30 NAME=CorreoE VALUE=<%=rs("CorreoE")%>>
<TR>
<TD ALIGN=RIGHT>Nombre de Usuario:
<TD><INPUT TYPE=TEXT SIZE=30 NAME=Usuario VALUE=<%=rs("Usuario")%>>
<TR>
<TD ALIGN=RIGHT>Contraseña:
<TD><INPUT TYPE=PASSWORD SIZE=30 NAME=Contrasenia VALUE=<%=rs("Contrasenia")%>>
</TABLE>
<P>
<INPUT TYPE=RESET VALUE=Limpiar>

<INPUT TYPE=SUBMIT VALUE=Actualizar>
</FORM>
</BODY>
</HTML>
<%
rs.Close
Set rs=Nothing
conexion.Close
Set conexion=Nothing
%>

Una vez que el usuario modifica los datos y pulsa el botón "Actualizar", la información es enviada a la página "cambiarDatos.asp", que se encargará de actualizar el registro correspondiente, siempre que el usuario no haya cambiado su nombre:

<%@ LANGUAGE=VBScript %>
<% Option Explicit %>
<!--#include virtual="/adovbs.inc"-->
<HTML>
<BODY TEXT=BLUE>
<%
Dim conexion,rs,encontrar
encontrar=False
Set conexion=Server.CreateObject("ADODB.Connection")
conexion.ConnectionString="DSN=Empresa.dsn"
conexion.Open
Set rs=Server.CreateObject("ADODB.Recordset")
rs.ActiveConnection=conexion
rs.Source="Usuarios"
rs.LockType=adLockOptimistic
rs.Open
Do While NOT (rs.EOF OR encontrar)
If (StrComp(rs("Usuario"),Request.Form("Usuario"),1)=0) Then
encontrar=True
Else
rs.MoveNext
End If
Loop
If NOT encontrar Then
rs.Close
Set rs=Nothing
conexion.Close
Set conexion=Nothing
Response.Write "<H2>No puede modificar su nombre de usuario</H2>"
Response.Write "<A href='inicioSesion.html'>Volver a Inicio de Sesión</A>"
Response.End
End If
rs("Nombre")=Request.Form("Nombre")
rs("Apellido")=Request.Form("Apellido")
rs("CorreoE")=Request.Form("CorreoE")
rs("Contrasenia")=Request.Form("Contrasenia")
rs.Update
rs.Close
Set rs=Nothing
conexion.Close
Set conexión=Nothing
Response.Write "<H2>Los cambios se realizaron satisfactoriamente</H2>"
%>
</BODY>
</HTML>

El método open

Hasta ahora, el formato general que hemos empleado para acceder a los registros de una tabla de una base de datos es el siguiente:

1º Declarar las variables que guardarán los objetos Connection y Recordset.
2º Crear una instancia del objeto Connection.
3º Especificar la base de datos a la cual representará el objeto Connection.
4º Abrir la conexión con la base de datos.
5º Crear una instancia del objeto Recordset.
6º Especificar cuál es la conexión activa.
7º Especificar cuál es la tabla a la cual representará el objeto Recordset.
8º Especificar el tipo de bloqueo del Recordset.
9º Especificar el tipo de cursor del Recordset.

Y por último abrir la conexión con la tabla.

De igual forma que a través del método open del objeto Connection podemos especificar el DSN de la base de datos, podemos utilizar el método open del objeto Recordset para simplificar el código. Su sintaxis es la siguiente:

nombre_recordset.Open origen, conexion, cursor, bloqueo, comando

- origen: es equivalente a la propiedad Source de Recordset. Por lo tanto es el nombre de una tabla o un subconjunto de una tabla (sentencia SQL, objeto Command).
- conexion: es equivalente a la propiedad ActiveConnection de Recordset. Por lo tanto es un objeto
Connection o una cadena que contiene la información de conexión. Si se usa una cadena, ésta debe
contener toda la información que iría en la propiedad ConnectionString del objeto Connection.
- cursor: es equivalente a la propiedad CursorType de Recordset. Por lo tanto especifica la forma en la que queremos movernos por el Recordset. Si no lo indicamos explícitamente, su valor predeterminado es adOpenForwardOnly, aunque debemos dejar su lugar correspondiente en el método open (..., conexion, , bloqueo, ...).
- bloqueo: es equivalente a la propiedad LockType de Recordset. Por lo tanto especifica si se puede escribir en la tabla y de qué forma. De igual forma, aunque no lo indiquemos explícitamente, debemos dejar su lugar correspondiente en le método open, siendo adLockReadOnly su valor por defecto.
- comando: indica qué tipo de parámetro es origen. Si se trata de un nombre de una tabla, su valor debe ser adCmdTable; si se trata de una sentencia SQL, no debemos especificar nada.

Así, por ejemplo, la conexión que abrimos en la página "cambiarDatos.asp" con la tabla "Usuarios" de la base de datos "Empresa.mdb" puede quedar como sigue:

Dim rs
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "Usuarios", "Empresa.dsn", , adLockOptimistic, adCmdTable
...
...
rs.Close
Set rs=Nothing

Ya que estamos incluyendo en el método open de Recordset la cadena "Empresa.dsn" correspondiente a la propiedad ConnectionString del objeto Connection, no es necesario crear el objeto Connection explícitamente.
La conexión se establece también, simplemente no tendremos ningún nombre con el que hacer referencia a ella.

EL OBJETO COMMAND

En el apartado anterior hemos visto cómo reducir las líneas de código necesarias para establecer una conexión con una tabla de una base de datos, utilizando el método open del objeto Recordset y creando implícitamente el objeto Connection.
También podemos crear de forma ímplicita el objeto Recordset, bien utilizando el método Execute del objeto Connection, o bien utilizando el objeto Command.
El objeto Command representará una tabla o un subconjunto de los registros de una tabla. Para usarlo en una página ASP debemos crear explícitamente una instancia:

Dim com
Set com = Server.CreateObject("ADODB.Command")

Después de haber creado la instancia del objeto Command, podremos establecer sus propiedades y ejecutar el método Execute para que devuelva una instancia del objeto Recordset.

Propiedades

ActiveConnection: hace referencia al objeto Connection, es decir, especifica la base de datos con la que se ha establecido la conexión.
CommandText: es el nombre de una tabla o una sentencia SQL.
CommandType: si CommandText es el nombre de una tabla, debemos establecer esta propiedad a adCmdTable.

Métodos

Execute: es similar al método Execute del objeto Connection. Crea un Recordset de manera implícita cuando
es ejecutado después de establecer correctamente todas la propiedades del objeto Command.

Por ejemplo, la conexión que abrimos en la página "cambiarDatos.asp" con la tabla "Usuarios" de la base de datos "Empresa.mdb" se podría escribir también de la siguiente forma:

Dim conexion, com, rs
Set conexion = Server.CreateObject("ADODB.Connection")
conexion.ConnectionString = "DSN=Empresa.dsn"
conexion.Open
Set com = Server.CreateObject("ADODB.Command")
com.ActiveConnection = conexion
com.CommandText = "Usuarios"
com.CommandType = adCmdTable
Set rs = com.Execute
...
...
rs.Close
Set rs=Nothing
conexion.Close
Set conexión=Nothing

3.INSTRUCCIONES SQL PARA CONSULTAR DATOS

Ya hemos visto que el objeto Recordset puede representar una tabla completa de la base de datos o un
subconjunto de elementos de la misma.

Una forma de filtrar los datos de la tabla es utilizar la propiedad Filter del objeto Recordset. Sin embargo, este método sigue guardando en el objeto Recordset la tabla completa, aunque tras aplicarle Filter trabaje con aquellos elementos que nos interesen.

Las instrucciones SQL pueden usarse para actualizar, insertar, borrar y consultar datos. Dado que las tareas de inserción, actualización y eliminación de registros pueden manejarse fácilmente mediante ADO, nos centraremos en la consulta de datos a través de SQL.

Para obtener datos de una tabla de la base de datos utilizaremos una instrucción SELECT. La instrucción SELECT tiene la siguiente sintaxis:

SELECT lista_campos FROM nombre_tabla [WHERE condición_búsqueda] [ORDER BY nombre_campo]

Las cláusulas SELECT y FROM son obligatorias, mientras que WHERE y ORDER BY son opcionales.

En la lista de campos de la cláusula SELECT, especificamos los nombres de las columnas de la tabla que queremos que formen parte del Recordset, separados por comas. Si queremos que el Recordset guarde todos los campos de la tabla, podemos utilizar un asterisco.

En el nombre de la tabla, especificamos el nombre de la tabla de la base de datos de la cual queremos recuperar datos.

Vamos a utilizar una tabla para los ejemplos. Creamos la tabla "Productos" en la base de datos "Empresa.mdb", con los campos IDProducto (autonumérico), Nombre (texto), Precio (moneda), Inventario (numérico):

Por ejemplo, si queremos obtener toda la tabla completa utilizamos la instrucción:

SELECT * FROM Productos

Si solamente queremos recuperar el nombre y el precio de los productos:

SELECT Nombre, Precio FROM Productos

LA CLÁUSULA WHERE

Esta cláusula especifica una instrucción lógica para filtrar las filas que queremos recuperar. Por ejemplo, si queremos obtener los productos cuyo precio es menor que 100 utilizamos la instrucción:

SELECT * FROM Productos WHERE Precio < 100

En la construcción de la instrucción lógica podemos utilizar cualquier operador de comparación (=, <, <=, >, >=, !=, <>), para comparar el valor de una columna específica. A su vez, cada comparación puede estar seguida de un operador lógico (AND, OR, NOT). Por ejemplo, si queremos trabajar con aquellos productos cuyo precio es menor de 100 € y con más de 100 unidades en inventario, emplearemos la siguiente instrucción:

SELECT * FROM Productos WHERE Precio < 100 AND Inventario > 100

Si utilizamos varios operadores lógicos diferentes, debemos tener en cuenta el orden de prioridad (NOT, AND, OR) o emplear los paréntesis para indicar la precedencia de los operadores.

Por otra parte, si se comparan columnas de cadena o fecha en una cláusula WHERE, es necesario encerrar entre comillas sencillas el valor con el que se está comparando la columna. Por ejemplo:

SELECT * FROM Productos WHERE Nombre = 'Monitor'

LA CLÁUSULA ORDER BY

Utilizaremos la cláusula ORDER BY para obtener de forma ordenada las filas de una tabla, según los valores de una columna particular. Por ejemplo, si queremos listar los productos alfabéticamente por su nombre, podemos utilizar la siguiente instrucción:

SELECT * FROM Productos ORDER BY Nombre

De forma predeterminada las filas se ordenan de manera ascendente, es decir, de menor a mayor. Si
queremos listar las filas en orden descendente, utilizaremos la palabra reservada DESC después del nombre de la columna en la cláusula ORDER BY. Ejemplo:

SELECT Nombre, Precio FROM Productos ORDER BY Nombre DESC

Por otra parte, podemos especificar más de un columna para determinar el orden en que queremos ver las filas. Basta con escribirlas tras la cláusula ORDER BY separadas por comas. La primera columna es sobre la que se realiza el ordenamiento y, si se producen empates, será la segunda columna la que los resuelva; si en este caso también se producen empates, resolverá la tercera columna y así sucesivamente. Ejemplo:

SELECT * FROM Productos ORDER BY Inventario DESC, Precio DESC


Posted in ASP |

8 Comments to “ASP - Acceso a Base de datos Access”

  1. emers Says:

    heeeaa!! no jodas que buen tutoría, desde cero, muy bien!
    estoy realizando algo con access y asp, la verdad es que de estos dos no se nada jaja, pero esto me va a ayudar bastante, gracias!

  2. lopezatienza Says:

    Un placer emerz, si necesitas alguna ayuda tanto de access como de asp no dudes en preguntarme e intentaré ayudarte en lo que pueda.

    Un saludo.

  3. emerz Says:

    eeeeh yo de nuevo, tengo un problema, al querer grabar en la base de datos con tu ejemplo de registro de usuarios, me da un error en la línea 16 (rs.Open) pero no se bien que show por que en el ejercicio anterior a veces me da el error y otras no, pero estoy creyendo que es algo sobre la conexión con el IIS, no se bien tal vez tu me puedas ayudar un poco con eso, por que ya lo revise una y otra vez y nada aun.

    saludos.

  4. lopezatienza Says:

    Hola emerz, la cadena de conexión me imagino que es correcta verdad? Me refiero a que conexion.Open no da problemas verdad?

    Es posible que la conexion se quede abierta, y por ello te de algún error al intentar acceder al objeto rs.

    Trata de añadirle al código una sentencia On Error Resume, que te muestra los posibles fallos en tiempo de ejecución:

    '============================

    On Error Resume Next

    ' TODO TU CODIGO

    If err = 0 Then
    Response.Write “Código correcto”
    Else
    Response.Write “Ha ocurrido un error:
    ” & err.Description
    End If

    '============================

    Un saludo.

  5. emerz Says:

    Gracias, creo que mejor será que cambie mi versión de Windows XP por Windows Server antes de seguir.

  6. lopezatienza Says:

    ¿Pero para que vas a cambiar la version de Windows?

  7. emerz Says:

    lo que pasa es que al querer correr los ejemplos, en algunas ocasiones me mandaba al carajo, entonces me puse a investigar por que iis me mandaba error en la linea rs.Open, y pues vi que era por el sistema operativo o cuna vaina. el caso es que igual y me sirve mas trabajar con un server y así corro las aplicaciones de mejor modo y no hay conflictos al momento de subirlas.

  8. lopezatienza Says:

    Ya bueno, de vez en cuando, cuando se actualiza alguna página en IIS se necesita reiniciar el Servicio:

    Panel de control / Herramientas administrativas / Servicios / Administración de IIS

    -> Botón derecho / Reiniciar

    Así te debería funcionar en principio.

    Echale un vistazo tambien en Servicios de IIS qué metodos de autentificación posee el sitio web.

    Y también el usuario ASPNET que permisos tiene.

    Esos suelen ser los principales motivos por los que un sitio web en IIS puede dar problemas.

    Un saludo.

Leave a Comment

RSS