我支持/增强用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中有哪些东西你会被认为是“陷阱”,我应该注意什么?
答案 0 :(得分:10)
在我之后重复:所有优秀的VB程序员都使用Option Explicit
它会让你不小心声明一个新变量并使用它 - 从而抛弃你正在做的事情。
除此之外,这取决于你正在做什么。
答案 1 :(得分:8)
当你看到以下行时要小心:
On Error Resume Next
这是我使用经典ASP时的谨慎。
答案 2 :(得分:4)
条件有时不直观。
例如,在处理Null
时:虽然True
和Null
不相等,但以下表达式的行为与False
相同。在这种情况下,最好使用Null
明确检查IsNull
。
valueIsTrue = True
valueIsNull = Null
If valueIsTrue <> valueIsNull Then ...
此外,与其他一些语言不同,即使第一部分是False
,也会评估条件的所有部分。例如,如果myObject
为Nothing
:
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)