VBScript bedingte Kurzschlüsse Abhilfe
-
09-06-2019 - |
Frage
Ich habe eine große klassische ASP-Anwendung, die ich pflegen müssen, und ich mich immer wieder durch das Fehlen von Kurzschluss Auswertbarkeit vereitelte finden. Z. B. wird VBScript lassen Sie nicht weg mit:
if not isNull(Rs("myField")) and Rs("myField") <> 0 then
...
... denn wenn Rs ( „myField“) null ist, erhalten Sie einen Fehler im zweiten Zustand erhalten, zu vergleichen null auf 0 Also werde ich in der Regel tun dies am Ende statt:
dim myField
if isNull(Rs("myField")) then
myField = 0
else
myField = Rs("myField")
end if
if myField <> 0 then
...
Offensichtlich ist die verboseness ziemlich erschreckend. Sie suchen, um dieses große Code-Basis, die beste Abhilfe, die ich gefunden habe, ist eine Funktion der ursprünglichen Programmierer verwenden schrieb, genannt TernaryOp, die im Grunde in ternäre Operator-ähnliche Funktionalität Transplantate, aber ich bin immer noch mit einer temporären Variablen stecken das wäre nicht in einer voll funktionsfähigen Sprache erforderlich. Gibt es einen besseren Weg? Einige super-geheime Art und Weise, dass ein Kurzschluss wirklich in VBScript existiert?
Lösung
Vielleicht nicht der beste Weg, aber es funktioniert sicherlich ... Auch, wenn Sie in VB6 oder .net sind, können Sie verschiedene Methoden, die auch in dem richtigen Typ gegossen.
if cint( getVal( rs("blah"), "" ) )<> 0 then
'do something
end if
function getVal( v, replacementVal )
if v is nothing then
getVal = replacementVal
else
getVal = v
end if
end function
Andere Tipps
Verschachtelte IFs (nur etwas weniger ausführlich):
if not isNull(Rs("myField")) Then
if Rs("myField") <> 0 then
ich immer Select Case-Anweisungen Kurzschlusslogik in VB verwendet. So etwas wie ..
Select Case True
Case isNull(Rs("myField"))
myField = 0
Case (Rs("myField") <> 0)
myField = Rs("myField")
Case Else
myField = -1
End Select
Meine Syntax ausgeschaltet sein kann, schon eine Weile. Wenn der erste Fall erscheint, alles andere wird ignoriert.
Oder vielleicht habe ich das falsche Ende der Frage. Meinen Sie so etwas wie iIf()
in VB? Dies funktioniert für mich:
myField = returnIf(isNothing(rs("myField")), 0, rs("myField"))
wo returnIf()
ist eine Funktion wie folgt:
function returnIf(uExpression, uTrue, uFalse)
if (uExpression = true) then returnIf = uTrue else returnIf = uFalse : end if
end function
Wenn Sie es als zwei Inline-IF
Anweisungen schreiben, können Sie einen Kurzschluss erreichen:
if not isNull(Rs("myField")) then if Rs("myField") <> 0 then ...
Aber Ihre then
Klage als auch auf der gleichen Zeile erscheinen. Wenn Sie mehrere Anweisungen nach then
benötigen, können Sie sie mit :
trennen oder den Code zu einem Unterprogramm bewegen, die Sie aufrufen können. Zum Beispiel:
if not isNull(Rs("myField")) then if Rs("myField") <> 0 then x = 1 : y = 2
oder
if not isNull(Rs("myField")) then if Rs("myField") <> 0 then DoSomething(Rs("myField"))
Ich wollte, es gab, mein Freund - TernaryOp ist Ihre einzige Hoffnung.
Ja, es ist nicht die beste Lösung, aber was wir haben ist so etwas wie diese
function ReplaceNull(s)
if IsNull(s) or s = "" then
ReplaceNull = " "
else
ReplaceNull = s
end if
end function
Zwei Optionen in den Sinn kommen:
1) verwenden len()
oder lenb()
um herauszufinden, ob es irgendwelche Daten in der Variablen ist:
if not lenb(rs("myField"))=0 then...
2) verwenden, um eine Funktion, die einen Booleschen Wert zurück:
if not isNothing(rs("myField")) then...
wo isNothing()
ist eine Funktion wie folgt:
function isNothing(vInput)
isNothing = false : vInput = trim(vInput)
if vartype(vInput)=0 or isEmpty(vInput) or isNull(vInput) or lenb(vInput)=0 then isNothing = true : end if
end function
Sie können möglicherweise nur Else
verwenden nulls zu fangen "" s, etc.
If UCase(Rs("myField")) = "THING" then
'Do Things
elseif UCase(Rs("myField")) = "STUFF" then
'Do Other Stuff
else
'Invalid data, such as a NULL, "", etc.
'Throw an error, do nothing, or default action
End If
Ich habe das in meinem Code getestet und es ist zur Zeit arbeitet. Vielleicht nicht jedermanns Sache aber die Situation richtig sein.