Вы не проверяете, имеют ли в вашем результирующем наборе какие-либо данные или строку.
ResultSet rs = stmt.executeQuery();
rs.next();
...
...
Вы должны проверить, является ли ваш результат пустым или имеет любую строку:
ResultSet rs = stmt.executeQuery();
if(rs.next()){
.....
your code
.....
}
Вы можете использовать GetValueOrDefault
-метод:
Dim a As Boolean?
Dim b As Boolean = a.GetValueOrDefault()
Вы также можете использовать CBool
Dim a As Boolean?
Dim b As Boolean = CBool(a = True)
Вы должны быть осторожны с различиями между 0, Nothing и vbNull. 0 является значением по умолчанию для логического значения. vbNull - это зарезервированное значение Null, которое должно переводиться как 1. Ничто не вызовет исключение почти во всех обстоятельствах.
Dim a As Boolean? = Nothing
Dim b As Boolean? = vbNull
Dim c As Boolean = vbNull
Dim d As Boolean
Print(a = True) 'will throw an Exception
Print(b = True) 'will return True (as vbNull = Int(1))
Print(c = True) 'will return True as the ? is unnecessary on a Boolean as vbNull = Int(1)
Print(d = True) 'will return False as the default value of a Boolean is 0
Print(a.GetValueOrDefault) 'will return False as this handles the Nothing case.
При работе с неназначенными значениями вы должны всегда сначала проверять Nothing (или просто следовать хорошей практике и устанавливать значение перед использованием).
Dim a As Boolean?
Dim b As Boolean = IIf(IsNothing(a), False, a)
Это вернет False, если a - Nothing, иначе вернет A.
Только после проверки на Nothing вы можете проверить на vbNull, поскольку Nothing возвращает ошибку для всех значений. Код ниже вернет False, если Nothing, или vbNull, или как-то иначе.
Dim a As Boolean?
Dim b As Boolean = IIf(IsNothing(a), False, IIf(a = vbNull, False, a))
Примечание: вы не можете использовать приведенный ниже код, так как тест a = vbNull будет против Ничего, которое вызовет исключение.
Or(IsNothing(a), a = vbNull)
Я бы также не стал использовать GetValueOrDefault в любом реальном приложении, так как при использовании более сложных типов данных значение по умолчанию не будет таким простым и вы можете получить неожиданные результаты. ИМХО гораздо лучше проверить на IsNothing (или Object = Nothing, Object Is Nothing), чем полагаться на причуды типа данных.
Лучшей практикой было бы убедиться, что a имеет значение, что вы можете сделать, используя
Dim a As Boolean? = New Boolean()
Dim b As Boolean = a
Причина, по которой я говорю, что это лучшая практика, заключается в том, что для всех классов, а не только логические. Отмечено, что это логично для логических выражений.
Надеюсь, это поможет.