formatnumber examples classic asp asp-classic vbscript decimal

asp-classic - classic - vbscript examples



ASP/VBScript "Gotchas" (9)

Asegúrate de usar Set para referencias de objetos:

Dim rs : Set rs = CreateObject("ADODB.Recordset");

Si no lo hace, obtendrá una referencia de variable no válida o la propiedad predeterminada

Dim field : Set field = rs(0) Dim fieldValue : fieldValue = rs(0) ''Same as field.Value

Estoy apoyando / mejorando una aplicación web escrita en ASP / VBScript clásico. Han pasado unos 10 años desde que lo utilicé en una capacidad diaria. Acabo de encontrar un problema que consideraría un "error" y me preguntaba si otros tenían cosas similares de las que debería aprender a ser consciente.

Mi problema:
Tuve que convertir una columna en una tabla SQL de float a decimal. Resulta que el decimal no es un tipo realmente soportado (o compatible) en vbscript. Entonces el siguiente código:

Dim var1, var2 var1 = rs("DecimalField1").Value var2 = rs("DecimalField2").Value If (var1 <> var2) Then ''Do Something'' End If

Estallaría con un error de Tipo No coincidente en la línea:

If (var1 <> var2) Then

Después de mucho buscar descubrí que:

var1 = CDBL(rs("DecimalField1").Value) var2 = CDBL(rs("DecimalField2").Value)

resuelve el problema Pero eso no parecía ser una cosa obvia y me tomó un tiempo descubrir por qué diablos estaba obteniendo un desajuste de tipo en esa línea.

Entonces mi pregunta a todos es, ¿con qué otras peculiaridades como esta te encuentras? ¿Cuáles son algunas cosas dentro de ASP / vbscript que pensarías como "errores" que debería estar pendiente?


La asignación automática de variables es probablemente uno de los mayores problemas.

Dim varA, varB varA = varA + varV

Oops! ¿Qué es varV preguntas? Bueno ... Acabo de escribir mal B por V y todo sigue funcionando perfectamente ... ¡eso debe ser algo bueno!

Excepto por qué no se agrega varB a varA ?? ¡Ese debe ser el error de Microsoft!


Puede dejar fuera el paréntesis al pasar argumentos a las funciones, pero solo si la llamada a la función es la única expresión en el enunciado:

DoSomething withThisArgument Dim result : result = DoSomething(withThisArgument) result = DoSomething withThisArgument ''SYNTAX ERROR


Un Gotcha común cuando se usan formularios HTML es una falta de coincidencia entre el CharSet de la página del formulario y la Página de códigos de la página receptora.

Un ejemplo típico es donde la página Form establece su CodePage en 65001 y la respuesta CharSet en UTF-8. Esto hace que los valores ingresados ​​en el formulario se vuelvan a enviar usando la codificación UTF-8. La página de recepción deja su CodePage configurando la página de códigos OEM del sistema como 1252.

Counter intuativamente ASP usa Response.CodePage para determinar cómo deben interpretarse los caracteres en la publicación del formulario, por lo tanto, la codificación UTF-8 se acepta erróneamente como un conjunto de 1252 caracteres que corrompen la entrada.

A veces esto no se detecta porque la página responde lo establece Reponse.CharSet en UTF-8, pero no modifica su CodePage. El resultado para el usuario parece bueno, pero los datos ingresados ​​en la base de datos están dañados.

Mi recomendación es Guardar como UTF-8, usar @codepage = 65001 en todas las páginas y siempre establecer Response.CharSet en UTF-8. Esto cubre todo.


Tenga cuidado siempre que vea la siguiente línea:

On Error Resume Next

Esa sería mi precaución al usar ASP clásico.


VBScript tiene una forma desagradable de permitirle llamar subs con paréntesis si solo tiene 1 parámetro. Sin embargo, si ese parámetro se pasa por referencia, el valor de retorno no aparece si usa paréntesis:

<% OPTION EXPLICIT %> <% sub MakeLonger(byref something) something = "hello " & something end sub dim msg msg = "World" MakeLonger(msg) response.write msg response.write "<br />" MakeLonger msg response.write msg %>

La salida es:

World hello World


ASP clásico tiene muchos problemas si nunca trabajaste con él :) recomendaría echarle un vistazo a la biblioteca ajaxed, que es una biblioteca ASP todavía conservada. Le ayuda a deshacerse de los errores más comunes cuando se trata de aplicaciones heredadas.


Repita después de mí: todos los buenos programadores de VB usan Option Explicit

Evitará que accidentalmente declare una nueva variable y la use, descartando lo que esté haciendo.

Más allá de eso, depende de lo que estás haciendo.


Los condicionales son un poco intuitivos a veces.

Por ejemplo, cuando se trata de Null s: Aunque True y Null no son iguales, la siguiente expresión actuará como False . En este caso, es bueno comprobar Null explícitamente utilizando IsNull .

valueIsTrue = True valueIsNull = Null If valueIsTrue <> valueIsNull Then ...

Además, a diferencia de algunos otros idiomas, todas las partes de una condición se evalúan incluso si la primera parte es False . Por ejemplo, el siguiente ejemplo devolvería un error si myObject fuera Nothing :

If Not IsNothing(myObject) And myObject.IsValid() Then ...

La solución es separar las condiciones utilizando If s anidadas u otros medios:

If Not IsNothing(myObject) Then If myObject.IsValid() Then ...