[Indice]


El método Server.CreateObject

Server.CreateObject("ADODB.Connection")

Server.CreateObject("ADODB.RecordSet")

El ejemplo siguiente crea dos objetos: DB que es del tipo Connection (conexión) a una DB y RS que es un RecordSet (conjunto de registros extraido de una DB). Estos nombres son libres, y puedes llamarlos como quieras:

<%
Set DB = Server.CreateObject("ADODB.Connection")
Set RS = Server.CreateObject("ADODB.RecordSet")
%>

Esta es una buena muestra de la gran potencia y versatilidad de ASP. Con el objeto Server.CreateObject() hemos creado otros dos objetos de ADO: Connection y RecordSet. el primero será utilizado para establecer un vínculo con la base de datos, y el segundo nos servirá para manipular los datos.

Seguramente te habrás fijado en que hay una instrucción que hasta ahora no habíamos visto: Set. En efecto, hasta el momento para asignar un valor a una variable, simplemente escribíamos una igualdad, por ejemplo:
      Nuevocod = Request.Form("NuevoCod").
Esto se puede hacer siempre que la variable vaya a recibir como valor un string, un número, el resultado de una función, una propiedad o un método, pero en el caso de un objeto hay que anteponer la instrucción Set, tal como se muestra. Cuando más tarde se cierre el objeto, hay que recuperar los recursos asignados ahora. Close es en realidad un método, y se encarga de vaciar el buffer y de cerrar el objeto. Después, la instrucción Nothing indica al sistema que el objeto ya no está vinculado a ninguna variable, por lo que sus recursos pueden ser recuperados.

Veamos ahora cómo utilizar las propiedades de los dos objetos creados. Si preparamos una consulta escrita en SQL para el objeto DB, podremos extraer información de la Base de Datos y cargarla en el objeto RS, lo que nos permitirá movernos por el RecordSet o ver su contenido con toda facilidad:


<%
SQL ="SELECT convert(char(8), nom_dni) + nom_nif AS 'NIF', " & _
     "nom_apellidos AS 'Apellidos', "  & _
     "nom_nombre AS 'Nombre', " & _
     "nom_postal AS 'Postal' " & _
     "nom_postal + ' ' + nom_localidad AS 'Localidad', " & _
     "nom_provincia AS 'Provincia' " & _
     "FROM nombres WHERE nom_dni = 12345678 "
%>
Y ahora abrimos los objetos y les damos parámetros:

<%
DB.Open "DB_nombre", "DB_user", "DB_password"
RS.Open SQL, DB
%>

Esto coloca el puntero en el primer registro del RecordSet. Ahora, mediante un bucle, mostraremos en la pantalla del cliente el contenido del RecordSet en formato de tabla:


<% 
'---Se comprueba si el RecordSet viene vacio. Si tiene contenido, se muestran los  
'---registros utilizando las propiedades y colecciones del objeto RS.

If RS.EOF AND RS.BOF Then
   Response.Write("Error. No se encontraron registros")
 Else
   Response.Write("<TABLE BORDER=1>")

   For i = 0 to RS.Fields.Count - 1
       Response.Write("<TR><TH>") 
       Response.Write(RS(i).Name)
       Response.Write("</TH><TD>")
       Response.Write(RS(i))
       Response.Write("</TD></TR>")
   Next
   Response.Write("</TABLE>")
End if

'---Se cierran los objetos, en orden inverso a como se abrieron, y se liberan los 
'---recursos que el servidor les habia asignado, con la instrucción Nothing

RS.Close
Set RS = Nothing
DB.Close
Set DB = Nothing
%>

Y este podría ser el resultado (en cuanto a forma, el contenido depende de lo que haya en la tabla, claro):

NIF12345678Z
ApellidosGarcia
NombreJuan
Postal12345
Localidad12345 Villa Desconocida
ProvinciaGuadalajara

En este ejemplo se han visualizado todos los registros y campos de la tabla contenida en el objeto RS, sin necesidad de saber cuantos hay ni sus nombres, es decir, utilizando una colección, pero este objeto tiene varios métodos que nos permitirán movernos por los registros, y por los campos que los componen, invocando su nombre: por ejemplo, para ver sólo el contenido del campo Provincia, se escribe:

<%
Response.Write( RS("Provincia") )
%>

Para escribir un valor en un campo de un registro se procede así:

<%
RS("Provincia") = "Toledo"
RS("Postal") = 54321
%>

Fíjate en que si el tipo de dato del campo es numérico el valor no debe ir entrecomillado, pero si el tipo es de texto o de fecha sí. Para moverse por el RecordSet tenemos los siguientes métodos:

El RecordSet también puede ser manejado por páginas enteras en lugar de registro a registro. Para ello, primero hay que definir una constante llamada adOpenkeyset cuyo valor por defecto es cero, y es correcto para transacciones registro a registro, pero si queremos paginar el RecordSet tiene que valer 1. Por supuesto, hay que definirla antes de crear el objeto RS. Se define así:

<%
Const adOpenkeyset = 1
%>

Dispondremos de tres propiedades para movernos por las páginas del RecordSet:

Y de una para el número de registros total: Y ahora veamos cómo utilizarlas:

<%
Const adOpenkeyset = 1

Set RS = Server.CreateObject("ADODB.Recordset")
RS.PageSize = 10
RS.Open SQL, DB, adOpenKeyset
%>

Como puedes ver, se procede igual que en el anterior ejemplo, pero incluyendo como parámetro de apertura del objeto RS la constante adOpenKeyset e indicando, antes de proceder a la apertura, el número de registros que debe contener la página: RS.PageSize = 10.

Con todo lo dicho hasta aquí no debes tener dificultad (salvo en los comandos VBScript, tal vez) en comprender cómo funciona el siguiente ejemplo de programa con estos dos objetos ADO (ActiveX Data Object).

Distintos métodos de apertura

En la apertura de la Base de Datos del ejemplo se ha utilizado la forma

<%
DB.Open "DB_nombre", "DB_user", "DB_password"
%>

Esta es la forma denominada con DSN en la que el parámetro DB_nombre en realidad no hace referencia al nombre de la base de datos que se desea abrir, sino al nombre del origen de datos ODBC que previamente se habrá creado en el servidor, y que puede tener el mismo nombre que la base de datos a la que apunta o el que se le quiera dar. Pero puede suceder que no tengas acceso físico al servidor para crear ese ODBC, cosa habitual si tienes tus páginas en un "hosting" alquilado.

Para resolver este problema, existen otras formas de apertura:

Sin DSN:
<%
DSN="DRIVER={SQL Server};SERVER=mi_server;UID=mi_user;PWD=mi_passw;DATABASE=mi_db"
DB.open DSN
%>

OLE sin DSN:
<%
DB.open "PROVIDER=SQLOLEDB;DATA SOURCE=mi_server;UID=mi_user;PWD=mi_passw;DATABASE=mi_db"
%>


[Indice]