Ваш While
цикл и If
оператор не имеют смысла. Во-первых, HasRows
- это тип Boolean
, поэтому проверка, является ли он больше нуля, не имеет смысла. Во-вторых, Read
возвращает False
, если строк нет, поэтому единственный способ добраться до этого оператора If
- это прочитать хотя бы одну строку, поэтому тестируйте HasRows
, когда вы уже знаете, что строки есть. тоже бессмысленно. Правильным вариантом здесь является использование только оператора If
и проверка только Read
:
If dr.Read() Then
'There is a row to read and it was just read, so you can now get the data from the reader.
Else
'There is no row to read.
End If
Если вы хотите очистить элемент управления при отсутствии данных, вы делаете это в блоке Else
.
«Правила» о том, когда и как использовать HasRows
и Read
, очень просты и логичны:
- Если все, что вас волнует, - содержит ли набор результатов запроса данные или нет, но вам все равно, что это за данные, просто используйте оператор
If
для проверки HasRows
. Свойство HasRows
имеет тип Boolean
, поэтому его не нужно ни с чем сравнивать. Это уже True
или False
.
- Если в наборе результатов может быть только ноль или одна строка, просто используйте оператор
If
, чтобы вызвать Read
и проверить результат. Опять же, это тип Boolean
, поэтому нет необходимости сравнивать его с чем-либо. Если он возвращает True
, то вы можете получить доступ к данным только что прочитанной строки.
- Если может быть несколько строк, и вы не хотите делать ничего особенного, если строк нет, просто используйте цикл
While
или Do While
, чтобы вызвать Read
и получить доступ к строке, только что прочитанной внутри петля.
- Если может быть несколько строк и вы хотите сделать что-то особенное, если строк нет, используйте оператор
If
для проверки HasRows
, а затем цикл While
или Do While
внутри If
блок для вызова Read
. Вы бы справились со случаем, когда в блоке Else
нет строк.