Вам нужно вызвать метод Read , прежде чем пытаться извлечь что-то из DataReader, даже если вы вызываете HasRows и он возвращает true.
Вызов Read необходим, потому что после выполнения команды вернуть читателя этот объект не содержит данных из первой записи и только после Read вы можете начать получать свои данные.
If reader.Read() Then
name = reader("UserFirstName").ToString
MsgBox(name)
End If
Как видите, вам не нужен вызов HasRows , потому что если нет записей для чтения, метод Read возвращает непосредственно false.