Classic ASP el misterio de los registros perdidos
 

Para quienes hace tiempo que trabajamos en sistemas, la triada VBScript, VisualBasic y Classic ASP fue una bendicin, muchos, comenzamos a armar una "Toolbox" basada en VBScript que podamos portar casi sin cambiar cdigo a VB5, VB6, o ASP, tal vez por eso para muchos de nosotros Classic ASP an esta vigente... para que arreglar algo que no est roto?

Missing Rows

Bueno, teniendo en claro porque an utilizamos Classic ASP, hace unos das en un dashboard que habamos realizado para un cliente basado en Classic ASP y SQL Server, recibimos una consulta de un cliente

Porque no ponen ms el nombre del campo en las exportaciones?.

Qu???? fue la respuesta inmediata... el cdigo no se toc... los nombres de los campos en las exportaciones CSV deban estar alli...
Para sacarnos las dudas, realizamos pruebas, como siempre.. y las mismas mostraban que los nombres de los campos estaban...por lo que pedimos al usuario que nos enviara un archivo ejemplo... Efectivamente en el archivo del usuario, el registro 1 estaba ausente... que haba pasado??? Haba un error de cdigo????

El cdigo

No vamos a copiar aqu todo el cdigo para ejemplificar, pero si alguna parte pertinente como la siguiente

En este caso, el Classic ASP tiene por objeto conectarse a una base de datos y responder el cdigo de la seleccin solicitada por el usuario de forma que el mismo se descargue como un archivo CSV

En la imagen anterior, se muestra como se habilita el buffer para receptar alli el "Select" de la consulta seleccionada y asi poder descargar el mismo como un archivo CSV

Revisando el cdigo vemos que efectivamente los titulares o nombres de campos deban aparecer pues estaban siendo ledos del recordset previamente abierto (como muestra el cdigo)

Peeeeerrrrooooo.... en el archivo finalmente no aparecan...

Solo para clarificar, el cdigo de cierre de consulta sera ms o menos el siguiente, con el que se cierran el recordset y la conexin a la base de datos y luego el buffer, finalmente se trasladando la data al cliente.

Entonces porque las "missing rows"

Si el cdigo anterior funciona en algunos casos y en otros no, debera ser evidente para nosotros que el problema est en el buffer... pero... como solucionarlo si necesitamos el buffer porque estamos descargando data en formato que el navegador interpreta como archivo, por lo que necesitamos que todo el conjunto funcione.

Recordemos que iniciamos indicando que usamos ClassicASP, por ende, no tenemos posibilidad de cambiar el buffer desde el cdigo ASP... tenemos que buscar otra forma..

Entonces, lo que nos queda como solucin es intervenir el IIS.

Por defecto, el IIS permite un buffer de 4Mbs, lo que en este caso era el problema, necesitabamos expandir ese limite

Ingresamos entonces al administrador de IIS, buscamos el site en cuestin y luego hacemos doble click en ASP, para expandir all la opcin "Limits Properties"

All aparecer nuestro limite de buffer, podemos entonces, ampliar este dato a nuestras necesidades. El valos est expresado en bytes, por lo que si queremos llevarlo a 8mbs, deberamos indicar 8388608, (que surge de 8x1024x1024)

Finalizando

Una vez cambiado el valor, solo nos resta reiniciar el site

Y volver a realizar la consulta.. en este caso... dado que el buffer ser el suficiente, la informacin aparecer completa, y se habrn acabado los "missing rows" al inicio del archivo.

Resumen

La utilizacin del buffer en Classic ASP es un "must" cuando queremos que nuestras querys sean devueltas en formato de archivos de descarga, sin embargo, tenemos que contemplar la posibilidad de ampliar el buffer a los efectos de evitar la prdida de rows.
Ahora bien, en realidad, cuando se da un buffer overflow, se da un error Response object error 'ASP 0251 : 80004005' Response Buffer Limit Exceeded , error que podemos capturar para arrojar un mensaje al usuario indicando que reduzca el rango de seleccin para achicar la informacin que recibe, o bien podemos modificar el buffer para ampliarlo a las necesidades.... o ambas cosas...

En nuestro ejemplo (si bien no se ve en el cdigo mostrado), una clausula "on error resume next" haca que estas opciones no aparecieran, dando como resultado un archivo de menor cantidad de registros, por lo tanto, perdiendo los primeros registros, de ahi que los cabezales con los nombres de los campos no aparecieran...

 

 

Volver a lista de Notas

Comentarios
Nombre:
(opcional)
E-Mail:
(opcional)
No Completar:
(opcional)
Comentarios:
-