В результате цепочки комментариев к вопросу ...
Вы получаете исключение здесь:
usuario.idUsuario = (int)rdr["idUsuario"];
Я не знаком с конкретным переводомИсключение составляют португальские настройки, но, по сути, это означает, что вы пытаетесь прочитать данные, когда ни один из них не доступен.Что слегка вводит в заблуждение, поскольку - это данные, возвращаемые из запроса (именно поэтому rdr.HasRows
разрешается в true
). Но вы не позвонили rdr.Read()
, чтобы получить доступ к первой записи в результатах.Даже если есть только одна запись, технически это все же набор записей, в котором есть только одна запись.И DataReader
нужно сказать, чтобы пройти через эту коллекцию.
Взгляните на некоторые примеры здесь .Конкретно, как они структурируют чтение результатов:
while (reader.Read())
{
//...
}
В этом случае вызов .Read()
возвращает bool
, указывающий, есть ли следующая запись для чтения, но это также тихо продвигает DataReader
внутри, чтобы получить доступ к следующей записи.
Вы можете использовать эту же структуру цикла и ожидать, что она зациклится только один раз, поскольку должна быть только одна возвращенная запись,(Не мешало бы добавить некоторую проверку ошибок, чтобы обработать неожиданные возможности, если возвращается более одной записи.) Или вы могли бы даже просто вызвать .Read()
один раз:
if (rdr.HasRows)
{
rdr.Read();
// the rest of your code
}
Еще одна вещь, которую стоит отметить, которая не связана с проблемой, но важна независимо.Во-первых, для новичка тот факт, что вы используете параметры запроса вместо прямой конкатенации строковых значений, является очень хорошей вещью .Однако в вашем коде есть еще одна проблема безопасности, о которой вам следует знать.Вы храните пароли пользователей в виде простого текста.Это очень плохая вещь .Вы не хотите когда-либо видеть или знать пароли ваших пользователей.
В .NET Framework существуют инструменты аутентификации, которые могут выполнить большую часть работы за вас.Но даже при создании собственного вы всегда должны хэшировать пароли.(Не шифровать , хэш . Это очень важное различие.) И с хорошими методами хеширования ( не MD5).Таким образом, никто не сможет восстановить исходный пароль.Не злоумышленник, даже вы как владелец системы.