ASP / VBScript“陷入困境”

时间:2008-11-13 16:15:58

标签: asp-classic vbscript decimal

我支持/增强用Classic ASP / VBScript编写的Web应用程序。自从我使用日常生产能力以来已经过去了大约10年。我刚遇到一个我认为是“陷阱”的问题,并且想知道其他人是否有类似我应该学会了解的事情。

我的问题:
我不得不将SQL表中的列从float转换为decimal。事实证明,十进制不是vbscript中真正支持(或支持得很好)的类型。所以下面的代码:

Dim var1, var2

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

If (var1 <> var2) Then
    'Do Something'
End If

在线路上会出现类型不匹配错误:

If (var1 <> var2) Then

经过多次搜索,我发现了:

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

解决了这个问题。但这似乎并不是一个显而易见的事情,我花了一段时间才弄清楚为什么我会在那条线上遇到类型不匹配。

所以我对每个人的问题是,你遇到过这样的其他小问题吗? ASP / vbscript中有哪些东西你会被认为是“陷阱”,我应该注意什么?

9 个答案:

答案 0 :(得分:10)

在我之后重复:所有优秀的VB程序员都使用Option Explicit

它会让你不小心声明一个新变量并使用它 - 从而抛弃你正在做的事情。

除此之外,这取决于你正在做什么。

答案 1 :(得分:8)

当你看到以下行时要小心:

On Error Resume Next

这是我使用经典ASP时的谨慎。

答案 2 :(得分:4)

条件有时不直观。

例如,在处理Null时:虽然TrueNull不相等,但以下表达式的行为与False相同。在这种情况下,最好使用Null明确检查IsNull

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

此外,与其他一些语言不同,即使第一部分是False,也会评估条件的所有部分。例如,如果myObjectNothing

,则以下示例将返回错误
If Not IsNothing(myObject) And myObject.IsValid() Then ...

解决方案是使用嵌套的If或其他方法分离条件:

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

答案 3 :(得分:3)

使用HTML表单时常见的问题是表单页面的CharSet与接收页面的CodePage之间不匹配。

一个典型的例子是Form页面将其CodePage设置为65001,将响应CharSet设置为UTF-8。这会导致使用UTF-8编码回发输入到表单中的任何值。接收页面将其CodePage设置为系统OEM代码页,如1252.

反直觉地,ASP使用Response.CodePage来确定如何解释表单post中的字符,因此错误地接受UTF-8编码作为破坏输入的1252个字符集。

有时这不会被检测到,因为页面响应将Reponse.CharSet设置为UTF-8但保持其CodePage不变。用户的结果看起来不错,但输入数据库的数据已损坏。

我的建议是另存为UTF-8,在所有页面中使用@codepage = 65001,并始终将Response.CharSet设置为UTF-8。这涵盖了一切。

答案 4 :(得分:3)

如果只有1个参数,VBScript有一种让你用括号调用subs的方法。但是,如果通过引用传递该参数,则使用括号时返回值不会出现:

<% 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

%>

输出是:

World 
hello World

答案 5 :(得分:2)

确保使用 Set 进行对象引用:

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

如果不这样做,您将获得无效的变量引用或默认属性

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

答案 6 :(得分:1)

在向函数传递参数时,可以省略括号,但前提是函数调用是语句中唯一的表达式:

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

答案 7 :(得分:0)

自动变量分配可能是最大的陷阱之一。

Dim varA, varB

varA = varA + varV

糟糕!你问的varV是什么?嗯..我只是错误地输入B代表V并且一切仍然完美无缺......这一定是件好事!

为什么不将varB添加到varA?这一定是微软的错误!

答案 8 :(得分:0)

如果你从未使用它,那么经典ASP有很多陷阱:) 我建议看看ajaxed library这是一个仍然维护的经典asp库。它可以帮助您在处理遗留应用程序时摆脱最常见的陷阱。