Eric Colgan
Eric Colgan

Reputation: 79

weird IF statement error " Conversion from string "FAIL" to type 'Long' is not valid."

I'm basically running through rows in a table. I'm checking each row to see if at least 1 of the columns im interested is = "pass" and that the rest = either "pass" or "N/A". But im getting an error:

"An exception of type 'System.InvalidCastException' occurred in Microsoft.VisualBasic.dll but was not handled in user code

Additional information: Conversion from string "FAIL" to type 'Long' is not valid." The statuses can either be "PASS", "FAIL", OR "N/A" in the DB is you're wondering where the FAIL came from.

Here's the code:

Private Function HasAuditPassed(activeLotId As String) As Boolean
    Dim sql = String.Format("SELECT STEPID, CAVITYPAIRASTATUS,CAVITYPAIRBSTATUS,CAVITYPAIRCSTATUS,CAVITYPAIRDSTATUS FROM " & _
                "TB_BL_AMMSSTEPSTATUS WHERE AUDITLOT = '{0}'", activeLotId)

    Dim dynaset = DB.CreateDynaset(sql, DBWrapper.DynasetOptions.ORADYN_READONLY)

    Do Until dynaset.EOF
        Dim cavityPairAStatus = dynaset.GetFieldData(Of String)("CAVITYPAIRASTATUS")
        Dim cavityPairBStatus = dynaset.GetFieldData(Of String)("CAVITYPAIRBSTATUS")
        Dim cavityPairCStatus = dynaset.GetFieldData(Of String)("CAVITYPAIRCSTATUS")
        Dim cavityPairDStatus = dynaset.GetFieldData(Of String)("CAVITYPAIRDSTATUS")

        If (cavityPairAStatus Or cavityPairBStatus Or cavityPairCStatus Or cavityPairDStatus) = "PASS" And
            (cavityPairAStatus And cavityPairBStatus And cavityPairCStatus And cavityPairDStatus) = ("PASS" Or "N/A") Then
            Return True
        End If
    Loop
    Return False
End Function

Upvotes: 0

Views: 385

Answers (3)

user5003554
user5003554

Reputation:

Sadly, you can't do if statements that way. You have to write the entire statement out because VB .Net does not handle string comparison that way. So a statement that would be the equivalent and work would be much longer and look like this:

If (cavityPairAStatus = "PASS" OrElse cavityPairBStatus = "PASS" OrElse 
    cavityPairCStatus = "PASS" OrElse cavityPairDStatus = "PASS")
    And (cavityPairAStatus = "PASS" OrElse cavityPairAStatus = "N/A" AndAlso
    cavityPairBStatus = "PASS" OrElse cavityPairBStatus = "N/A" AndAlso
    cavityPairCStatus = "PASS" OrElse cavityPairCStatus = "N/A" AndAlso
    cavityPairDStatus = "PASS" OrElse cavityPairDStatus = "N/A") Then
        Return True
End If

A few more elegant solutions with creating lists are below, and can be used to help out readability some if you have to write statements like this repeatedly.

Upvotes: 4

prem
prem

Reputation: 3548

The way IF statement you have used is incorrect. To compare so many conditions you need to write them separately.

Instead of using IF condition here I would suggest you to use a list. Here's the sample code

 Dim cavityPairStatus As New List(Of String)
    cavityPairStatus.Add(dynaset.GetFieldData(Of String)("CAVITYPAIRASTATUS"))
    cavityPairStatus.Add(dynaset.GetFieldData(Of String)("CAVITYPAIRBSTATUS"))
    cavityPairStatus.Add(dynaset.GetFieldData(Of String)("CAVITYPAIRCSTATUS"))
    cavityPairStatus.Add(dynaset.GetFieldData(Of String)("CAVITYPAIRDSTATUS"))
    If cavityPairStatus.Contains("PASS") OrElse cavityPairStatus.Contains("N/A") Then
        Return True
    End If

Upvotes: 0

Nitram
Nitram

Reputation: 6716

There are a couple of issues here. You can't write a If stytement in this style and you can't use binary operators (And and Or) with String.

Your If statement should be something like this:

If (cavityPairAStatus = "PASS" OrElse cavityPairBStatus = "PASS" OrElse  …

If you want something a little more elegant you may consider something like this:

Dim values = {cavityPairAStatus, cavityPairBStatus, cavityPairCStatus, cavityPairDStatus}
If values.Any(Function(v) v.Equals("PASS")) AndAlso values.All(Function(v) v.Equals("PASS") OrElse v.Equals("N/A")) Then
   …
End If

Upvotes: 2

Related Questions