jueves, julio 31, 2008

Cambio

Desde hace más de cuatro años que estoy en una posición de gestión. Esto me ha alejado de la tarea de escribir código. Por este motivo es poco frecuente que encuentre algo para postear en este blog.

Sin embargo, desarrollar sitios Web no sólo es escribir código por lo que decidí seguir manteniendo este blog y actualizarlo con otro tipo de posts más relacionado con lo que estoy haciendo ahora.

lunes, marzo 03, 2008

ASP en capas: Acceso a Datos

El principal punto a proteger en una aplicación Web es la base de datos. En este sentido hay que tener en cuenta que, cuanto más rápido liberemos la conexión, más rápida será nuestra aplicación. Una aplicación Web rápida es indudablemente más robusta que otra que tarda más tiempo en ejecutar.

Para recuperar datos y mostrarlos a los usuarios generalmente se utiliza un recordset más o menos así:
While not RS.EOF Then
Response.Write(...)
Wend
Este método no sólo es lento sino que además estamos utilizando, en la capa de presentación, un objeto de la capa de datos.

Para solucionar esto hice la clase "clsSql" con la que podemos ejecutar una consulta y obtendremos un Array de dos dimensiones donde la primera son los campos y la segunda son los registros. Para el resto de las operaciones en las que no se obtienen datos, debemos usar el clásico CONN.EXECUTE(query).

La clase tiene cuatro métodos solamente:
Public Sub Conectar (byRef Conn, ByVal ConnectionString)
Para conectarse a la base de datos.

Public Sub Desconectar (byRef Conn)
Para liberar la conexión.

Public Sub EjecutarQuery(ByRef Conn, ByVal Query, ByRef Resultado)
Este método ejecuta un "Query" en la conexión indicada y devuelve un Array con los datos obtenidos. Si no obtiene datos entonces "Resultado" estará vacío.

Public Sub EjecutarQueryPaginado(ByRef Conn, ByVal Query, ByRef Resultado, ByVal TamanoPagina, ByRef Pagina, ByRef CantPaginas, ByRef CantReg)
Este método ejecuta un "Query" en la conexión indicada y devuelve un Array conteniendo los datos correspondientes a la "Pagina" indicada teniendo en cuenta en "TamanoPagina". También devuelve la cantidad de páginas posibles y la cantidad de registros totales. Si el valor proporcionado de "Pagina" es inválido, lo modifica por el correcto.

Un ejemplo de uso de esta clase es:
Dim Bases
Dim conn
Dim arrResultado

set Bases = new clsSQL
Bases.Conectar(conn, "File DSN=BaseDeDatos.dsn")
Bases.EjecutarQuery(conn, "Select IdUsuario, Email from usuarios", arrResultado)
Bases.Desconectar(conn)
set clsSQL = Nothing

...

Dim a
If IsArray(arrResultado) Then 'Si arrResultado no es un array es que no se obtuvieron datos
For a = 0 to Ubound(arrResultado,2)
...
IdUsuario: <%=arrresultado(0,a)%>

Email: <%=arrresultado(1,a)%>
... Next
End If

Les dejo la clase para que la descarguen: clsSql
La URL del post anterior: ASP en capas: obtener valores por QueryString

lunes, enero 07, 2008

ASP en capas: obtener valores por QueryString

Vamos a comenzar a desarrollar la aplicación que mencionamos en el post anterior, y como queremos hacerlo con estilo, vamos a necesitar un poco de abstracción.

Lo primero que necesitamos es una forma para obtener valores desde "QueryString". Hace un tiempo comentamos como obtener valores por QueryString en .NET, ahora necesitamos hacerlo en ASP.

Hace algún tiempo construí la clase clsRequester para obtener valores por los tres métodos: querystring, form y cookie. Lo más importante de esta clase es que, al llamar a alguno de sus tres métodos públicos, debemos proporcionar un valor por defecto que será el resultado de la función cuando el obtenido no sea válido o no exista. Este valor por defecto debe ser del subtipo que esperamos conseguir (Integer, Byte, String, Date, etc).

Los métodos públicos de la clase clsRequester son:

public function Obtener(byval metodo, byval key, byval def)
Este método obtiene el valor de "key" por el "metodo" indicado. El dato obtenido se intenta convertir al subtipo de dato de "def". En caso de error se devuelve "def".
Ej: p = objRequester.Obtener("QueryString", "pagina", cint(1))

public function ObtenerB(byval metodo, byval key, byval def, byval min, byval max)
Obtiene el valor de "key" por el "metodo" indicado pero valida que dicho valor se encuentre entre un valor mínimo y un máximo (la B de ObtenerB es por Between). En caso de error o superar los límites, devuelve "def".
Ej: p = objRequester.ObtenerB("Cookie", "BirthDate", cdate("1901-01-01"), cdate("1910-01-01"), cdate("2000-12-31"))
Obtiene el de la cookie "BirthDate" y verifica que este comprendida entre las fechas indicadas. En caso de error devuelve la fecha 1 de enero del 1901.

public function ObtenerR(byval metodo, byval key, byval def, byval regex)
Obtiene el valor de "key" por el "metodo" indicado y lo valida con una Regular Expression. Este método es, por supuesto, para obtener "strings".
Ej: p = objRequester.ObtenerR("Form", "email", "", "\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*")
En este ejemplo, el email debe ser validado por la Reqular Expression, en caso contrario devuelve un string vacío.

Los métodos privados son:

Private Sub Class_Initialize
Para inicializar las variables.

Private Sub Class_Terminate
Si usamos un objeto Regular Expression lo destruye.

private sub MetodoDefault(byval metodo)
Verifica que exista el método indicado exista.

private function getValue(byval metodo, byval key)
Obtiene el valor por el método indicado.

private function Castear(byref dato, byval def)
Convierte el valor obtenido al subtipo del valor por defecto.

private Function ValidaExpresionesRegulares(ByVal texto, ByVal patron)
Valida el valor con la Regular Expression

Esta clase la utilizo en cada una de las aplicaciones que debo construir en ASP.
Aquí les dejo la clase Requester para que se la puedan bajar.