natknąłem się dzisiaj na dziwne zachowanie instrukcji VB.net If(). Może możesz wyjaśnić, dlaczego działa tak, jak działa, lub możesz potwierdzić, że to błąd.Dziwne zachowanie instrukcji If()
Mam bazę danych SQL z tabelą "TestTable" z kolumną int "NullableColumn", która może zawierać wartość NULL. Chciałbym przeczytać zawartość tej kolumny.
więc zadeklarować zmienną typu Nullable(Of Integer)
dla tej sprawy, otwórz SqlClient.SqlDataReader
dla „SELECT NullableColumn OD TestTable” i użyć następującego kodu, aby uzyskać zawartość tej kolumny:
Dim content as Nullable(Of Integer)
...
Using reader as SqlClient.SqlDataReader = ...
content = If(reader.IsDBNull(reader.GetOrdinal("NullableColumn")), Nothing, reader.GetInt32(reader.GetOrdinal("NullableColumn")))
End Using
Ale potem mój zmienna content
ma wartość 0, a nie Nothing
, tak jak bym się spodziewał.
Gdy debugowanie wszystko wygląda w porządku, więc
reader.GetOrdinal("NullableColumn")
zapewnia prawidłową porządkowej pozycji tej kolumnie (która jest 0)reader.IsDBNull(0)
ireader.IsDBNull(reader.GetOrdinal("NullableColumn"))
dostarczyćTrue
, ponieważ treść tej kolumnie rzeczywiście jest NULLIf(1=2, Nothing, "Not Nothing")
dostarcza ciąg "Not Nothing"If(1=1, Nothing, "Not Nothing")
dostarczaNothing
reader.GetInt32(reader.GetOrdinal("NullableColumn"))
zgłasza błąd, ponieważ NULL nie mogą być konwertowane doInteger
Więc dlaczego moja zmienna ma wartość 0?
Czy stosować normalne IF - następnie - elese oświadczenie? Czy to działa? –
Ciekawe, czy włączony jest "Option Strict"? Jeśli nie, powinieneś –
Tak, spróbowałem normalnego 'If ... Then ... Else ...' statemant, i to działało. Włączenie 'Option Strict' nic nie zmieniło. – Nostromo