Versión para imprimir / Salvar en Favoritos
Consulta a una base de datospor MOS
Ha llegado el momento de hacer nuestra primera consulta a una
base de datos. Supongo antes de empezar un par de cosas:
- 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.
- Que estáis familiarizados con mecanismos de programación básicos, tales
como bucles (
for, while)y sentencias condicionales
(if..then...else).
- 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.
- 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.
- 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.
- 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)
|