2008-11-13 48 views
9

我支持/增強用傳統ASP/VBScript編寫的Web應用程序。自從我使用日常的能力已經有大約10年了。我只是遇到了一個我認爲是「疑難雜症」的問題,並且想知道其他人是否有類似的事情,我應該學會注意。我不得不將SQL表中的Column從float轉換爲decimal。事實證明,十進制不是在vbscript中真正支持(或很好地支持)的類型。所以下面的代碼:ASP/VBScript「Gotchas」

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中有什麼東西可以作爲我應該關注的「陷阱」?

回答

2

確保您使用Set對象引用:

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

如果不這樣做,你會要麼得到一個無效的變量引用或默認屬性

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

在將參數傳遞給函數時,可以省略括號,但前提是函數調用是語句中的唯一表達式:

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

讀取和寫入沒有不必要的括號的語句比較容易。 – 2008-11-13 17:14:05

+0

您對術語表達的使用具有誤導性,聲明不是表達式。在表達式中使用函數時,總是需要使用括號。我從來沒有見過任何人嘗試過這個錯誤,並且因爲這被認爲是一個語法錯誤,所以它幾乎不是一個'Gotcha' – AnthonyWJones 2008-11-14 06:23:41

+0

這不是一個長期存在的問題,但是它是一個常見的(大部分是新的)VBScript作者。我沒有說一個陳述是一個表達。但是,聲明通常包含表達式。在「DoSomething arg」的情況下,它是由一個功能調用表達式組成的語句。 – 2008-11-14 18:21:47

0

自動變量分配可能是最大的問題之一。

Dim varA, varB 

varA = varA + varV 

哎呀!你問什麼是varV?那麼..我只是打錯了B的V,一切仍然完美..這肯定是件好事!

除了爲什麼不將varB添加到varA?這一定是微軟的錯誤!

3

使用HTML表單時常見的問題是表單頁面的CharSet與接收頁面的CodePage之間不匹配。

一個典型的例子是Form頁面將其CodePage設置爲65001並將響應CharSet設置爲UTF-8。這會導致輸入表單的任何值都將使用UTF-8編碼進行回發。接收頁面將其CodePage設置爲系統OEM代碼頁,例如1252.

計數器直觀ASP使用Response.CodePage來確定應如何解釋表單文章中的字符,因此UTF-8編碼會被錯誤地接受爲設置ot 1252個字符破壞輸入。

有時候這個不會被發現,因爲頁面響應會將它設置爲Reponse。CharSet設置爲UTF-8,但保持其CodePage不變。對用戶的結果看起來不錯,但輸入數據庫的數據已損壞。

我的建議是另存爲UTF-8,使用@CodePage = 65001中的所有頁面,並始終設置Response.Charset都爲UTF-8。這涵蓋了一切。之後我

10

重複:所有好VB程序員使用Option Explicit

那會讓你意外地宣佈一個新的變量,並用它 - 從而擺脫不管你在做什麼。

除此之外,這取決於你在做什麼。

4

條件有時有點不直觀。

例如,Null小號處理時:雖然TrueNull不相等,下面的表達式將像False。在這種情況下,最好使用IsNull明確檢查Null

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

此外,其它語言不同,條件的所有部分進行評估,即使第一部分是False。例如,下面的例子將返回一個錯誤,如果myObjectNothing

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

的解決方案是使用嵌套If S或一些其他手段來分隔條件:

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

謹防任何時候你看到的以下行:

On Error Resume Next 

這將是我使用經典的ASP謹慎。

3

VBScript中有讓你打電話用括號潛艇,如果你只有1個參數的nastly方式。但是,如果paramater通過引用傳遞,返回值不出來,如果你使用括號:

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

傳統的ASP有很多陷阱,如果你永遠工作與它:) 我會建議看看ajaxed library這是一個仍然保持經典的asp庫。它可以幫助您在處理舊版應用程序時擺脫最常見的陷阱。

相關問題