DNM+ Online
dotnetmania 2.0
ASP en ASP.NET sin esfuerzo
Este artículo no pretende en ningún caso enseñar a desarrollar páginas ASP.NET. Ese tema ha sido y será tratado por otros compañeros en posteriores artículos. Lo que se pretende es que podáis actualizar vuestros códigos ASP (ya escritos en VBScript) para que se ejecuten bajo el .NET Framework; obteniendo por tanto sus ventajas en cuanto a rendimiento.

Lo primero que debéis saber es ¿qué es la tecnología .NET de Microsoft? (cosa que deberíais hacer leyendo artículos o manuales al respecto), yo sólo os diré que funciona con la misma filosofía que Java. Se ha diseñado un entorno o máquina virtual (.NET Framework) que con una tecnología denominada Common Language Runtime (CLR) es capaz de ejecutar un código intermedio (MSIL). A su vez se han rediseñado una serie de lenguajes como Visual Basic .NET y JScript .NET (también se ha diseñado un nuevo lenguaje denominado C#), que son compilados a este lenguaje intermedio (o sea el resultado de la compilación de estos lenguajes no es código máquina ejecutable sino MSIL, para todos el mismo). Con todo ello se pretende que trozos de código escritos en diferentes lenguajes puedan interaccionar y también que el software se pueda portar a diferentes entornos (simplemente diseñando versiones del .NET Framework para otras plataformas y sin tener que cambiar ni una línea de código). A todo ello hay que añadir mejoras en la orientación a objeto de los lenguajes, la interrelación de los mismos a través del Visual Studio .NET, las nuevas librerías comunes (como ADO.NET) y otras nuevas características como el soporte SOAP/XML de intercambio de información. Bueno eso sólo era una pequeña introducción (tal vez hasta improcedente en una revista como ésta en la que podemos leer tanto sobre .Net, pero me gusta introducir los temas que voy a tratar), no os asustéis que a partir de ahora el tema va a ser más práctico. Dejémonos de discursos y pongamos manos a la obra. Centrémonos en nuestro objetivo: Queremos coger nuestra página ASP que funciona perfectamente y hacerla funcionar bajo ASP.NET (no me refiero a traducir el código ASP a código .Net sino a introducir algunas variaciones que lo hagan compatible con el .Net Framework). Para conseguirlo tomaremos una página de ejemplo escrita en ASP clásico e intentaremos ejecutarla directamente como si se tratara de una ASP.NET. Después iremos modificando el código para evitar los errores que nos irán apareciendo. En principio los errores se deberán, en su mayoría, a cambios sintácticos entre el VBScript (usado en las páginas ASP clásicas) y el Visual Basic.NET usado en las modernas ASP.NET. Hay que entender que ASP.NET no es una nueva versión de ASP, sino un cambio de tecnología por lo que no se mantiene toda la compatibilidad. (En este punto debo deciros que en un mismo sistema pueden coexistir páginas ASP clásicas y ASP.NET. Esto se debe a que usan librerias de ejecución distintas y el Internet Information Server usa la necesaria en cada caso) Bueno empecemos echándole un vistazo a la figura 1 que es la página que usaremos. Vamos  a usar una página típica en la que mostraremos en una lista datos obtenidos de una tabla de base de datos (concretamente una lista de tecnologías de desarrollo). Lo primero que nos encontramos en las líneas 1 y 2 es:

<%@ Language="vbscript" %> <% Option Explicit %>

En estas líneas definimos que vamos a usar el lenguaje VBScript y que queremos que se nos avise en el caso de que usemos variables sin declararlas. Seguidamente abrimos la conexión a la base de datos utilizando ADO (ActiveX Data Objects) y realizamos una consulta simple rellenando el recordset:

<% Dim oConn, rs, SQL set oConn = Server.CreateObject( "ADODB.Connection") set rs = Server.CreateObject( "ADODB.Recordset") oConn.Open "DRIVER={Microsoft Access
Driver (*.mdb); DBQ= " &
Server.MapPath("bd.mdb") SQL = "select * from desTemas" set rs = oConn.Execute(SQL) %>

Ahora la cabecera del documento HTML, abrimos el cuerpo del documento y la tabla:

<html> <head> <title>Actualizacion de ASP a
ASP PuntoNET</title> </head> <body> <table align="center">

A continuación creamos tantas celdas en la tabla (etiquetas <tr><td> </td></tr>) como registros haya en el recordset. Y escribimos dentro de cada celda lo devuelto por el campo nombre del recordset.

<% while not rs.EOF %>

<tr> <td> <%response.write rs("nombre")%> </td> </tr>

<% rs.movenext wend %>

Después cerramos la tabla, el cuerpo y el documento HTML:

</table> </body> </html>

Ya sólo nos queda cerrar la conexión:

<% rs.close set rs = nothing oConn.Close %>

Ni que decir tiene que este código tal y como está no se ejecuta correctamente sobre el .NET Framework. Así que ahora que conocemos el código del que partiremos empecemos con la transformación.

Lo primero que debemos hacer es cambiar la extensión de nuestro archivo de .ASP a .ASPX (debemos recordar que el Internet Information Server usará el ASP.DLL para manejar las páginas con extensión ASP y el ASPNET_WP.EXE para las de extensión ASPX); así el IIS entenderá que nuestra página debe ser ejecutada a través del .NET Framework (que lógicamente debe estar instalado en el servidor). Tras hacerlo mostramos nuestra página en un navegador.

Nos aparece la primera página de error (ver figura 2). Lo primero que advertimos es la mejora en los mensajes de error en relación a los que se mostraban en el sistema ASP clásico. Apreciamos como se nos indica un error en la línea 3 con la descripción:

"BC30024: La instrucción no es válida dentro de un método."

Este error hace referencia a que en ASP.NET no está permitido el uso de Option Explicit, para ello se ha creado un atributo de la directiva page de la página. O sea, debemos quitar el Option Explicit y colocar: <%@page explicit="true"%>

Tras volver a mostrar la página en el navegador nos aparece un nuevo mensaje de error que vemos en la figura 3. En dicho mensaje se nos advierte de que sólo puede haber una directiva page. Para poder indicar en una sola directiva page varias cosas se han creado los atributos. Hemos usado el atributo Explicit anteriormente y ahora usaremos el atributo language para indicar que usaremos Visual Basic .NET (aquí cabe recordar que en ASP.NET ya no se usa VBScript sino alguno de los lenguajes compatibles con .NET framework como Visual Basic .NET,  JScript .NET, C#, ...). Pondremos:

<%@page language="vb" explicit="true"%> De nuevo volvemos a intentar ejecutar la página (ver figura 4). El nuevo mensaje nos indica que en Visual Basic.NET han desaparecido las sentencias Set y Let por lo que debemos quitarlas. Las quitaremos en (dejamos las asignaciones igual pero sin SET):

set oConn = Server.CreateObject( "ADODB.Connection") set rs = Server.CreateObject( "ADODB.Recordset") y en:

set rs = oConn.Execute(SQL)

y

set rs = nothing

De nuevo recargamos la página en el navegador y de nuevo aparecen errores (ver la figura 5). Concretamente nos aparece un error en la linea 11, indicando:

"BC30800: Los argumentos de método se deben incluir entre paréntesis"

O sea, en Visual Basic.NET ha habido un cambio (con respecto a versiones anteriores) y ahora la sintaxis para parámetros de funciones y procedimientos es la misma; es obligatorio que vayan entre paréntesis. Por ello debemos cambiar las siguientes líneas:

oConn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ= "& Server.MapPath("..\db\bd.mdb")

por

oConn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ= "& Server.MapPath("..\db\bd.mdb"))

y

<%response.write rs("nombre")%>

por

<%response.write(rs("nombre"))%>

Y por fin ya no aparecen más mensajes de error. Pero ... ¿Que es lo que debería mostrarse en el navegador? ¿Y que es lo que aparece? Pues aparece una sucesión de System.__ComObject y pensaréis ¿esto que es? No os preocupéis, en este caso no hay errores sintácticos. Se trata de un error de conversión de tipos (por eso no hay mensaje). El problema radica en la linea 30: <%response.write(rs("nombre"))%> ¿qué ocurre, no ves ningún error? En realidad en VBScript no lo hay. El problema está en que Visual Basic.NET no permite usar propiedades de objeto por defecto. O sea, el objeto recordset tiene la propiedad por defecto fields (y ahora hay que escribirla explícitamente) y a su vez fields tiene la propiedad value (que también debemos indicar). En definitiva la línea nos queda:

<%response.write( rs.fields("nombre").value)%>

Tras todo esto y por fin, vemos el resultado deseado (idéntico al original en ASP clásico pero ahora ejecutado sobre un sistema mejorado y más eficiente. Ver figura 6). Bueno espero que este ejemplo de cómo actualizar una página ASP (vbscript) para que se ejecute correctamente bajo ASP.NET os haya servido y os permita optimizar vuestras páginas mientras aprendéis a crear verdaderas páginas ASP.NET. En la web de la revista y en http://www.indesia.com/Antigoto podéis encontrar los archivo con los códigos completos usados en el artículo para que lo podáis descargar. El código de la página original lo tenéis en el fichero ARTEJEMPLO01.ASP y las sucesivas actualizaciones en los ficheros ARTEJEMPLO01.ASPX a ARTEJEMPLO08.ASPX (en cada uno se ha ido subsanando un error) y también os paso una pequeña base de datos Access (la usada en el ejemplo) bd.mdb.

blog comments powered by Disqus
autor
referencias