ASP Fcil
El sitio para programadores ASP  

Búsqueda rápida
Ayuda
Secciones
Portada
Diario
Artículos
Código
Trucos
Foros ASP
Recursos
Favoritos
Referencia
Tutorial SQL
SQL-O-Matic
Otras
Boletín ASPFácil
Colabora
Sobre este sitio
Anunciarse aquí
Cont@ctar
Formación


Versión para imprimir / Salvar en Favoritos

Consulta a una base de datos

por MOS

Ha llegado el momento de hacer nuestra primera consulta a una base de datos. Supongo antes de empezar un par de cosas:

  1. Que sabéis a qué me refiero cuando hablo de bases de datos (tablas, registros, campos). Si no es así, leed el artículo de Introducción a MS Access y volved aquí luego.
  2. Que estáis familiarizados con mecanismos de programación básicos, tales como bucles (for, while)y sentencias condicionales (if..then...else).
  3. Que habéis leído los anteriores artículos para Principiantes, lo que implica que estáis en cierta medida familiarizados con variables, objetos, etc. en ASP.

Dicho esto, y como sé que la mayoría váis a seguir aquí, vamos a entrar en materia. Al fin y al cabo, a andar se aprende andando. (Eso dicen las madres) :-)

¿Recuerdas a tu amigo el moroso?

Me refiero a la base de datos Prueba que diseñamos en Access y a la que nos conectamos (con y sin DSN) en este artículo.

Suponemos que tenéis la conexión abierta, es decir, ya habéis puesto una línea como:

oConn.Open ...
Ahora vamos a decirle a la base de datos que queremos sacar datos.

Parece lógico pensar que el resultado de una consulta no lo vamos a almacenar en una variable. ¿Cómo vamos a tener una variable que almacene distintos nombres, fechas, etc.? Así que usamos otro objeto ADO, el objeto Recordset (en inglés, conjunto de registros).

Como con el objeto Connection, primero creamos una instancia del objeto en nuestra página ASP:

Dim oConn, rs ' rs será nuestro recordset

set oConn = Server.CreateObject("ADODB.Connection")
set rs = Server.CreateObject ("ADODB.Recordset")
o.Conn.Open ...

Ahora tenemos dos objetos listos para ser utilizados. Además, ya hemos utilizado el método Open del objeto oConn con lo cual la conexión está abierta. Vamos a ver cómo traemos cosas de la tabla con el método Open del objeto rs.

Este método se resume así:
rs.Open SQL, conexión, [cursor], [cerrojo]

  • SQL es el nombre de una variable donde guardamos las órdenes que vamos a dar a ADO para que trabaje con la base de datos.
  • conexión es una conexión abierta, en nuestro caso oConn.

Vamos a ver entonces el parámetro SQL.

SQL, el idioma de las bases de datos

SQL (Structured Query Language) es el lenguaje estándar que entienden las bases de datos. También es el lenguaje que utilizamos en las páginas ASP para trabajar con las bases de datos. En nuestro caso vamos a sacar datos de nuestra base de datos prueba.mdb, así que vamos a ver cómo hacer esto con SQL.

La instrucción para elegir (seleccionar) campos de una tabla es:
SELECT. A continuación hay que decir qué campos queremos, poniendo sus nombre separados por comas o bien eligiendo todos con un asterisco (*).

En nuestro caso, queremos sacar todos. Además, hay que decirle de qué tabla hay que sacar los datos. En prueba sólo tenemos una tabla, la de Libros, pero podríamos hacer también otra con nuestros discos de música, por ejemplo.

Con todo esto, nuestra sentencia SQL nos queda:

Dim SQL 'SQL es una variable!

SQL="SELECT * FROM Libros;"

Ponemos comillas porque SQL es una variable de texto, y un punto y coma (;) al final porque así se escribe el lenguaje SQL. Fijaos que esta orden SQL es equivalente a:

SQL="SELECT IdLibro, Titulo, Autor, Editorial, Moroso FROM Libros;"
Porque el * sustituye a los cinco campos de nuestra tabla.

Una vez que tenemos nuestra conexión y nuestra sentencia SQL, nos quedan dos campos para comentar de la sintaxis del método rs.Open, que son el cursor y el cerrojo (en inglés, Cursor y Lock). Estos parámetros especifican en detalle el comportamiento de la base de datos: cuando se actualiza si insertamos registos (cerrojo) o cómo podemos movernos por nuestro Recordset (cursor). Para este caso no nos interesa, así que no los ponemos. ¡Vamos a conectarnos ya! Incluyo el código completo, y ahora lo comentamos:

<%

Dim oConn, rs, SQL

set oConn = Server.CreateObject("ADODB.Connection") ' conexion
set rs = Server.CreateObject("ADODB.Recordset") ' recordset
oConn.Open "DSN=Prueba"
SQL="SELECT * FROM Libros;"
rs.Open SQL, oConn

%>

Hemos hecho dos instancias: un objeto Connection y un objeto Recordset. Hemos abierto nuestra conexión con el método Open del objeto oConn, en este caso usando un DSN de sistema, llamado Prueba.

Además, hemos dicho a ADO que nos traiga todos los campos de la tabla Libros. Por fin, ejecutamos la consulta con el método Open de nuestro rs.

¿Qué nos devuelve el método Open? Pues en este caso va a llenar nuestro recordset con la tabla entera: todos los campos y todos los registros. Así que ahora tendremos que sacar los datos de rs. Es realmente fácil, así que os lo explico en un santiamén con dos propiedades.

Nociones básicas del objeto Recordset

Sin duda las tres propiedades básicas del objeto Recordset son las que permiten sacar los datos, avanzar hacia el siguiente registro que hemos sacado de la base de datos, y detectar si quedan más registros (es decir, detectar el final de nuestro objeto Recordset).
Tenéis que saber que aunque físicamente tenemos toda nuestra tabla en rs, en realidad sólo podemos acceder al primer registro. rs está apuntando a nuestro primer registro, por eso tenemos que avanzar y detectar el final.

  1. Sacar los datos: se hace con la colección Fields(campos). Una colección es un conjunto de datos. Fields es una colección que tiene los nombres de los campos que hayamos seleccionado. En nuestro caso, tenemos Fields("Titulo"), Fields("Autor"), Fields("Editorial"), Fields("Moroso")y también Fields("IdLibro"). Así se accede a los campos: Fields y luego entre paréntesis y comillas el nombre del campo tal y como lo llamamos en nuestra base de datos. Para imprimir en pantalla entonces un campo de un registro usamos
    Response.Write(rs.Fields("Titulo")). Esto imprimiría el título del registro. También podemos asignar el valor a una variable e imprimirlo:

    ...
    Dim titulo
    titulo = rs.Fields("Titulo")
    Response.Write(titulo)
    ...
    Que produciría el mismo resultado.

  2. Avanzar: se hace con el método MoveNext (en inglés, mover al siguiente). Hacer algo como rs.MoveNext indica a rs que apunte al siguiente registro, con lo cual una nueva llamada a Fields sacaría el campo del siguiente registro.
  3. Detectar el final: se hace con la propiedad EOF. Viene del inglés End Of File (fin de fichero). Sólo tiene dos valores: verdadero o falso. Cuando rs está apuntando al último registro que ha traído de nuestra base de datos y avanzamos uno más, EOF se pone a true. Es sencillo, en cuanto lo pruebes lo entenderás del todo.

Con todo esto, vamos a sacar los datos de nuestro primer registro:

<%

Dim oConn, rs, SQL

set oConn = Server.CreateObject("ADODB.Connection") ' conexion
set rs = Server.CreateObject("ADODB.Recordset") ' recordset
oConn.Open "DSN=Prueba"
SQL="SELECT * FROM Libros;"
rs.Open SQL, oConn

Response.Write("Titulo: ")
Response.Write(rs.Fields("Titulo") & "<BR>")
Reponse.Write("Autor: ")
Response.Write(rs.Fields("Autor") & "<BR>")
Response.Write("Editorial: ")
Response.Write(rs.Fields("Editorial") & "<BR>")
Response.Write("Moroso: ")
Response.Write(rs.Fields("Moroso") & "<BR>")


%>

Esto producirá lo siguiente:

Titulo: Don Quijote de la Mancha
Autor: Miguel de Cervantes
Editorial:
Moroso: Sin prestar

Es fácil ¿no? Estamos tardando mucho porque es interesante entender los conceptos detrás, pero nuestra página ASP que trae datos de una base de datos Access y los imprime en la ventana del navegador tiene ¡21 líneas!

Ahora bien, para imprimir el resto, tendríamos que poner:

rs.MoveNext

y volver a escribir la serie de Response.Write, y luego hacer todo una vez más para nuestro tercer registro. Vamos a hacerlo de tal forma que no nos importe el número de registros que hemos sacado. Nos funcionará igual si tenemos 3 en la tabla o si tenemos 300. Y es utilizando un bucle que se detiene cuando rs.EOF sea verdadero, es decir cuando estemos al final de nuestro Recordset. Ahí va el código, con comentarios aclarativos:

<%

Dim oConn, rs, SQL

set oConn = Server.CreateObject("ADODB.Connection") ' conexion
set rs = Server.CreateObject("ADODB.Recordset") ' recordset
oConn.Open "DSN=Prueba"
SQL="SELECT * FROM Libros;"
rs.Open SQL, oConn

' Hacemos todo lo de debajo hasta que lleguemos al final!
do until rs.EOF
Response.Write("Titulo: ")
Response.Write(rs.Fields("Titulo") & "<BR>")
Reponse.Write("Autor: ")
Response.Write(rs.Fields("Autor") & "<BR>")
Response.Write("Editorial: ")
Response.Write(rs.Fields("Editorial") & "<BR>")
Response.Write("Moroso: ")
Response.Write(rs.Fields("Moroso") & "<BR>")
Response.Write("<BR>")
' Un espacio más para separar registros!
rs.MoveNext
' Pasamos al siguiente
loop
' Volvemos al do!

%>

Lo que produciría en nuestra página lo siguiente:

Titulo: Don Quijote de la Mancha
Autor: Miguel de Cervantes
Editorial:
Moroso: Sin prestar

Titulo: Carrie
Autor: Stephen Kin
Editorial: Plaza&Janés
Moroso: Pepe

Titulo: Pálido como la luz de luna
Autor: Mary Higgins Clark
Editorial: Plaza&Janés
Moroso: Mario

NOTA: Aunque también dijimos en nuestro SQL que sacara de la base de datos IdLibro, no lo hemos impreso. Lo podíamos haber hecho añadiendo un rs.Fields("IdLibro"). ¿OK?

¡Pues ya está! Ya sabemos sacar todos los registros de una tabla. Para practicar, probad a sacar sólo algunos campos, por ejemplo. O mejor aún, añadid más libros desde Access, recargad la página y veréis cómo os saca todos, ¡sin tener que cambiar ni una línea!. Váis viendo la potencia de ASP, ¿no?

Si tenéis algún problema probando las páginas, consultad la sección Principiantes, donde hay un artículo dedicado al tema.

Un saludo,
MOS

>> ¿Quieres saber cuándo se publicarán nuevos artículos? ¡Suscríbete al Boletín de ASPFácil! << 
>> Comparte tus dudas y comentarios sobre este artículo en el foro Artículos de ASPFácil << 
(Arriba)

© ASP Fácil 2000-2004 excepto en casos indicados
El mejor alojamiento web en acens