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 bendición, muchos, comenzamos a armar una "Toolbox" basada en VBScript que podíamos portar casi sin cambiar código a VB5, VB6, o ASP, tal vez por eso para muchos de nosotros Classic ASP aún esta vigente... para que arreglar algo que no está roto?

Missing Rows

Bueno, teniendo en claro porque aún utilizamos Classic ASP, hace unos días en un dashboard que habíamos realizado para un cliente basado en Classic ASP y SQL Server, recibimos una consulta de un cliente

Porque no ponen más el nombre del campo en las exportaciones?.

Qué???? fue la respuesta inmediata... el código no se tocó... los nombres de los campos en las exportaciones CSV debían 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 había pasado??? Había un error de código????

El código

No vamos a copiar aquí todo el código 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 código de la selección 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 código vemos que efectivamente los titulares o nombres de campos debían aparecer pues estaban siendo leídos del recordset previamente abierto (como muestra el código)

Peeeeerrrrooooo.... en el archivo finalmente no aparecían...

Solo para clarificar, el código de cierre de consulta sería más o menos el siguiente, con el que se cierran el recordset y la conexión a la base de datos y luego el buffer, finalmente se trasladando la data al cliente.

Entonces porque las "missing rows"

Si el código anterior funciona en algunos casos y en otros no, debería 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 código ASP... tenemos que buscar otra forma..

Entonces, lo que nos queda como solución 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 cuestión y luego hacemos doble click en ASP, para expandir allí la opción "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, deberíamos 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 información aparecerá completa, y se habrán acabado los "missing rows" al inicio del archivo.

Resumen

La utilización 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 pérdida 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 selección para achicar la información 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 código mostrado), una clausula "on error resume next" hacía 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