9

我正在支持/增强用 Classic ASP/VBScript 编写的 Web 应用程序。自从我每天使用这两种容量以来,已经有大约 10 年了。我刚刚遇到了一个我认为是“陷阱”的问题,并且想知道其他人是否有类似的事情我应该学会注意。

我的问题:
我必须将 SQL 表中的列从浮点数转换为十进制数。事实证明,十进制不是 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 中有哪些您认为是我应该注意的“陷阱”的东西?

4

9 回答 9

10

Repeat after me: All good VB programmers use Option Explicit

It will keep you from accidentally declaring a new variable and using it - thus throwing off whatever you are doing.

Beyond that, it depends on what you're doing.

于 2008-11-21T22:45:00.923 回答
8

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

On Error Resume Next

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

于 2008-11-23T05:25:31.443 回答
4

条件有时有点不直观。

例如,在处理Nulls 时:虽然TrueNull不相等,但下面的表达式会表现得像False。在这种情况下,最好检查Null明确使用IsNull.

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

此外,与其他一些语言不同,条件的所有部分都会被评估,即使第一部分是False. 例如,如果myObject是,以下示例将返回错误Nothing

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

解决方案是使用嵌套Ifs或其他方式分隔条件:

If Not IsNothing(myObject) Then
    If myObject.IsValid() Then
        ...
于 2008-11-23T04:13:14.130 回答
3

使用 HTML 表单时的一个常见问题是表单页面的 CharSet 和接收页面的 CodePage 不匹配。

一个典型的例子是表单页面将其 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。这涵盖了一切。

于 2008-11-14T06:18:30.730 回答
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
于 2009-01-26T20:14:47.593 回答
2

确保Set用于对象引用:

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

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

 Dim field      : Set field  = rs(0)
 Dim fieldValue : fieldValue = rs(0) 'Same as field.Value
于 2008-11-13T16:34:06.433 回答
1

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

 DoSomething withThisArgument
 Dim result : result = DoSomething(withThisArgument)
 result = DoSomething withThisArgument 'SYNTAX ERROR
于 2008-11-13T16:37:27.847 回答
0

classic ASP has a lot of gotchas if u never worked with it :) i would recommend having a look at ajaxed library which is a still maintained classic asp library. It helps you to get rid of most common gotchas when dealing with legacy apps.

于 2009-01-27T03:43:15.210 回答
0

自动变量分配可能是最大的问题之一。

Dim varA, varB

varA = varA + varV

哎呀!你varV问什么?嗯..我只是把 B 打错了 V 并且一切仍然完美.. 这一定是件好事!

除了为什么不将 varB 添加到 varA ?那一定是微软的bug!

于 2008-11-13T16:37:55.707 回答