2008-11-13 10 views
9

Ich unterstütze/verbessere eine Webanwendung, die in Classic ASP/VBScript geschrieben wurde. Es ist ungefähr 10 Jahre her, seit ich entweder in einer täglichen Kapazität verwendet habe. Ich bin gerade auf ein Problem gestoßen, das ich als "gotcha" bezeichnen würde und fragte mich, ob andere ähnliche Dinge hätten, die ich beachten sollte.ASP/VBScript "Gotchas"

Mein Problem:
Ich musste eine Spalte in einer SQL-Tabelle von Float zu Dezimal konvertieren. Es stellt sich heraus, dass dezimal nicht ein Typ ist, der in VBScript wirklich unterstützt (oder gut unterstützt) wird. So ist der folgende Code:

Dim var1, var2 

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

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

Würde mit einem Type Mismatch Fehler auf der Linie sprengen:

If (var1 <> var2) Then 

Nach langem Suchen fand ich heraus, dass:

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

das Problem behebt. Aber das schien nicht selbstverständlich zu sein und ich brauchte eine Weile, um herauszufinden, warum zum Teufel ich einen Typ Mismatch in dieser Zeile bekam.

Also meine Frage an alle ist, was andere kleine Macken wie diese haben Sie rüber? Was sind einige Dinge in ASP/vbscript, die Sie als "gotchas" betrachten würden, nach denen ich Ausschau halten sollte?

Antwort

2

Stellen Sie sicher, dass Sie Set für Objektreferenzen verwenden:

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

Wenn Sie dies nicht tun Sie entweder eine ungültige Variable Referenz erhalten oder die Standardeigenschaft

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

Sie können Klammern weglassen, wenn Sie Argumente an Funktionen übergeben, aber nur, wenn der Funktionsaufruf der einzige Ausdruck in der Anweisung ist:

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

Es ist einfacher, Anweisungen zu lesen und zu schreiben, die keine unumgänglichen Klammern haben. –

+0

Ihre Verwendung des Begriffs Ausdruck ist irreführend, eine Aussage ist kein Ausdruck. Bei Verwendung einer Funktion in einem Ausdruck werden immer Klammern benötigt. Ich habe noch nie gesehen, dass irgendjemand diesen Fehler versucht hat, und da dies als Syntaxfehler aufgefasst wird, ist es kaum ein "Gotcha" – AnthonyWJones

+0

Es ist kein langwieriger Gotcha, aber es ist ein gewöhnlicher, der (meistens neue) VBScript-Autoren stolpert. Ich habe nicht gesagt, dass eine Aussage ein Ausdruck war. Eine Anweisung enthält jedoch normalerweise Ausdrücke. Bei "DoSomething arg" handelt es sich um eine Aussage, die aus einem Funktionsaufruf-Ausdruck besteht. –

0

Automatische variable Zuweisung ist wahrscheinlich einer der größten Fehler.

Dim varA, varB 

varA = varA + varV 

Hoppla! Was ist varV Sie fragen? Nun .. Ich habe B für V vertippt und alles funktioniert immer noch perfekt. Das muss eine gute Sache sein!

Ausgenommen warum nicht varB varA hinzugefügt wird ?? Das muss Microsofts Bug sein!

+1

Dies gilt für die meisten dynamischen Sprachen. Sie sollten immer "Option Explicit" verwenden. –

3

Ein häufig auftretender Fehler bei der Verwendung von HTML-Formularen ist ein Konflikt zwischen dem CharSet der Formularseite und der CodePage der Empfängerseite.

Ein typisches Beispiel ist, wo die Formularseite die CodePage auf 65001 und die Antwort CharSet auf UTF-8 setzt. Dies bewirkt, dass alle in das Formular eingegebenen Werte mithilfe der UTF-8-Codierung zurückgesendet werden. Die empfangende Seite lässt ihre CodePage die System-OEM-Codepage wie 1252.

Counter intuitiv ASP verwendet die Response.CodePage, um zu bestimmen, wie die Zeichen in der Form Post interpretiert werden sollte, daher wird UTF-8-Codierung fälschlicherweise als akzeptiert Stellen Sie 1252 Zeichen ein, die die Eingabe verfälschen.

Manchmal bleibt dies unentdeckt, weil die Seite reagiert, legt sie Antwort fest.CharSet zu UTF-8, aber seine CodePage bleibt unverändert. Das Ergebnis für den Benutzer erscheint gut, aber die in die Datenbank eingegebenen Daten sind beschädigt.

Meine Empfehlung ist Speichern als UTF-8, verwenden Sie @ codepage = 65001 auf allen Seiten und immer Response.CharSet auf UTF-8. Das deckt alles ab.

10

Sprich mir nach: Alle guten VB Programmierer verwenden Option Explicit

Es wird Sie verhindern, versehentlich eine neue Variable deklarieren und sie mit - also weg zu werfen, was Sie tun.

Darüber hinaus hängt es davon ab, was Sie tun.

4

Conditionals sind manchmal ein wenig untuitiv.

Wenn zum Beispiel mit Null s Umgang: Obwohl True und Null nicht gleich sind, wird der folgende Ausdruck wie False handeln. In diesem Fall ist es ratsam, Null explizit mit IsNull zu überprüfen.

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

Auch im Gegensatz zu einigen anderen Sprachen, sind alle Teile einer Bedingung werden, auch wenn der erste Teil False ausgewertet. Zum Beispiel würde das folgende Beispiel einen Fehler zurück, wenn myObjectNothing waren:

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

Die Lösung, die Bedingungen mit verschachtelten If s oder anderen Mitteln zu trennen ist:

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

Passen Sie jederzeit sehen, die folgende Zeile:

On Error Resume Next 

Das wäre meine Vorsicht bei der Verwendung von klassischen ASP.

+0

Kein Zweifel, diese Programmierer haben sich daran gewöhnt, stillschweigend alle Ausnahmen zu essen. – SqlACID

+0

Natürlich gibt es nichts wie diese leeren Catch-Blöcke, um Fehler zu vermeiden. ;) –

3

VBScript bietet eine einfache Möglichkeit, Subs mit Klammern aufzurufen, wenn Sie nur 1 Parameter haben. Wenn jedoch die Paramater durch Referenz übergeben wird, wird der Rückgabewert nicht aus, wenn Sie Klammern verwenden:

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

%> 

Ausgang ist:

World 
hello World 
0

klassischen ASP viel gotchas hat, wenn u nie gearbeitet damit :) würde ich empfehlen, einen Blick auf ajaxed library, die eine immer noch gepflegte klassische ASP-Bibliothek ist. Es hilft Ihnen, die häufigsten Fehler im Umgang mit Legacy-Apps loszuwerden.

Verwandte Themen