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?

War es hilfreich?

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 = "&nbsp;"
    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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top