2008-11-13 8 views
9

Wspieram/ulepszam aplikację internetową napisaną w klasycznym ASP/VBScript. Minęło około 10 lat, odkąd używam ich codziennie. Właśnie natknąłem się na kwestię, którą uważam za "gotcha" i zastanawiałem się, czy inni mają podobne rzeczy, których powinienem się nauczyć.ASP/VBScript "Gotchas"

Mój problem:
Musiałem przekonwertować kolumnę w tabeli SQL z wartości liczbowej na dziesiętną. Okazuje się, że dziesiętny nie jest typem, który jest naprawdę obsługiwany (lub obsługiwany dobrze) w vbscript. Więc następujący kod:

Dim var1, var2 

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

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

Czy wysadzić z błędem Niezgodność typu na linii:

If (var1 <> var2) Then 

Po długich poszukiwaniach okazało się, że:

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

rozwiązuje ten problem. Ale nie wydawało się to oczywiste i zajęło mi trochę czasu, aby dowiedzieć się, dlaczego do cholery dostaję niedopasowanie typu w tej linii.

Więc moje pytanie do wszystkich jest takie, jakie inne dziwactwa takie jak to masz? Jakie rzeczy można znaleźć w ASP/vbscript jako "gotchas", na które powinienem zwrócić uwagę?

Odpowiedz

2

Upewnij się, że używasz Set o referencje obiektów:

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

Jeśli nie będziesz albo dostać niepoprawną zmienną odniesienia lub właściwość domyślny

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

Podczas przekazywania argumentów do funkcji można pominąć nawias, ale tylko wtedy, gdy wywołanie funkcji jest jedynym wyrażeniem w instrukcji:

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

Łatwiej jest czytać i pisać instrukcje, które nie mają niepoprawnego nawiasu. –

+0

Używanie wyrażenia jest mylące, oświadczenie nie jest wyrażeniem. Podczas używania funkcji w wyrażeniu zawsze są potrzebne nawiasy. Nigdy nie widziałem, żeby ktokolwiek próbował tego błędu, a ponieważ jest to błędem składniowym, to nie jest to "Gotcha" – AnthonyWJones

+0

To nie jest długotrwały problem, ale jest pospolity, który wyrusza w górę (głównie nowych) autorów VBScript. Nie powiedziałem, że oświadczenie było wyrażeniem. Jednak instrukcja zazwyczaj zawiera wyrażenia. W przypadku "DoSomething arg" jest to instrukcja składająca się z jednego wyrażenia wywołującego funkcję. –

0

Automatyczna alokacja zmiennych jest prawdopodobnie jedną z największych wartości.

Dim varA, varB 

varA = varA + varV 

Ups! Co to jest varV, o którą pytasz? Cóż ... Po prostu źle wpisałem B na V i wszystko nadal działa idealnie. To musi być dobre!

Z wyjątkiem tego, dlaczego varB nie jest dodawany do varA ?? To musi być błąd Microsoftu!

+1

Dotyczy to większości dynamicznych języków. Powinieneś zawsze używać "Option Explicit". –

3

Powszechnym utworem Gotcha w przypadku korzystania z formularzy HTML jest niezgodność między CharSet strony formularza i strony CodePage strony odbierającej.

Typowym przykładem jest strona formularza, w której strona CodePage ma wartość 65001, a znak odpowiedzi CharSet na kodowanie UTF-8. Powoduje to, że wszelkie wartości wprowadzone do formularza zostaną odesłane z powrotem przy użyciu kodowania UTF-8. Strona odbierająca opuszcza swój zestaw CodePage stronę kodową System OEM taką 1252.

Licznik intuicyjnie ASP wykorzystuje metodę Response.CodePage do określenia sposobu interpretacji znaków w formularzu, dlatego kodowanie UTF-8 jest błędnie akceptowane jako ustaw 1252 znaków powodujących uszkodzenie danych wejściowych.

Czasami pozostaje to niewykryte, ponieważ strona odpowiada ustawia Reponse.CharSet do UTF-8, ale pozostawia niezmienioną stronę CodePage. Wynik dla użytkownika wydaje się dobry, ale dane wprowadzone do bazy danych są uszkodzone.

Moja rekomendacja to Zapisz jako UTF-8, użyj @codepage = 65001 na wszystkich stronach i zawsze ustaw Response.CharSet na UTF-8. Obejmuje to wszystko.

10

Powtarzaj za mną: Wszystkie dobrych programistów VB używać Option Explicit

Będzie uniemożliwiają przypadkowe deklarowania nowej zmiennej i użyciu go - tym samym wyrzucając cokolwiek robisz.

Poza tym to zależy od tego, co robisz.

4

Wyrażenia warunkowe są czasami nieintuicyjne.

Na przykład, gdy mamy do czynienia z Null s: Chociaż True i Null nie są równe, następujące wyrażenie będzie działać jak False. W takim przypadku dobrze jest sprawdzić pod kątem Null jawnie przy użyciu IsNull.

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

Ponadto, w przeciwieństwie do niektórych innych językach, wszystkie części stanu są oceniane nawet jeśli pierwsza część jest False. Na przykład, następujący przykład zwróciłby błąd, jeśli myObject były Nothing:

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

Rozwiązaniem jest oddzielić warunki korzystania zagnieżdżone If s lub jakieś inne środki:

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

Beware każdej chwili zobaczyć linia:

On Error Resume Next 

Byłoby to moją ostrożnością w używaniu klasycznego ASP.

+0

Bez wątpienia ci programiści przeszli do cichego jedzenia wszystkich wyjątków. – SqlACID

+0

Oczywiście, nie ma nic takiego jak te puste bloki catch, aby zapobiec pojawianiu się błędów. ;) –

3

VBScript ma paskudny sposób wywoływania podpórek za pomocą nawiasów, jeśli masz tylko jeden parametr. Jednakże, jeśli paramater jest przekazywane przez referencję, wartość zwracana nie wyjdzie, jeśli używasz nawiasów:

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

%> 

wyjścia:

World 
hello World 
0

klasyczny ASP ma wiele pułapek, jeśli nie u pracował z nim :) Polecam spojrzeć na ajaxed library, który jest nadal utrzymany klasycznej biblioteki asp. Pomaga ci pozbyć się najczęstszych błędów podczas pracy ze starszymi aplikacjami.