InvalidOperationException, когда я пытаюсь получить пароль из базы данных, «Недопустимая попытка чтения, когда нет данных».

1

Это мой код, мне нужно получить LoginPassword из базы данных

public partial class frmPassword : Form
{
    SqlConnection connection = new SqlConnection(@"Data Source=WORKSTATION\SQLEXPRESS;Initial Catalog=TPSystem;Integrated Security=True");

    public frmPassword()
    {
        InitializeComponent();
    }

    private void btnUpdatePassword_Click(object sender, EventArgs e)
    {
        frmLogin login = new frmLogin();
        string UserN = login.UName;
        string Pass;
        SqlCommand cmd = new SqlCommand("SELECT Login_Password FROM AdminLogin WHERE Login_Username = '"+UserN+"'", connection);

        try
        {
            connection.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            reader.Read();

            Pass = reader["Login_Password"].ToString();

            if (tbOldPassword.Text == Pass)
                MessageBox.Show("Password matches");
            else
                MessageBox.Show("Password wrong");
            reader.Close();
        }
        catch (SqlException ex)
        {
            MessageBox.Show(ex.Message, "Report", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);
        }
        finally
        {
            connection.Close();
        }
    }
}

Я получил эту ошибку при выполнении:

Необработанное исключение типа "System.InvalidOperationException" произошло в System.Data.dll

Дополнительная информация: Неправильная попытка чтения, когда данные отсутствуют.

  • 0
    На какой линии это происходит?
  • 0
    @gunr2171 gunr2171 это строка "Pass = reader [" Login_Password "]. ToString ();"
Показать ещё 4 комментария
Теги:
sql-server

2 ответа

4

reader.Read() возвращают логическое значение, чтобы указать, действительно ли что-то было прочитано - вы не проверяете это вообще...

Измените свой код на:

if(reader.Read())
{
    Pass = reader["Login_Password"].ToString();

    if (tbOldPassword.Text == Pass)
            MessageBox.Show("Password matches");
    else
            MessageBox.Show("Password wrong");
}

Если ничего не было прочитано, я думаю, что ваш пользователь не существует - я не уверен, что вы хотите сделать в этом случае... до вас

Но, пожалуйста, скажите, что вы не храните пароли в ясном тексте в своей базе данных !!!!

  • 0
    Вы могли бы упомянуть, что if (reader.HasRows) также будет полезен для (предварительной) проверки наличия строк вообще. Мне нравится использовать его в первую очередь, потому что он не продвигает читателя к следующей / первой записи, поэтому у него нет побочных эффектов.
  • 0
    @TimSchmelter: я никогда не использую .HasRows - имеет ли это какое-то преимущество по сравнению с простым вызовом .Read() и проверкой результата, если строк нет?
Показать ещё 1 комментарий
1

Кажется, что в базе данных нет записи для имени пользователя, которое вы проверяете. Проверьте, возвращает ли получатель результат:

public partial class frmPassword : Form
{
    SqlConnection connection = new SqlConnection(@"Data Source=WORKSTATION\SQLEXPRESS;Initial Catalog=TPSystem;Integrated Security=True");

    public frmPassword()
    {
        InitializeComponent();
    }

    private void btnUpdatePassword_Click(object sender, EventArgs e)
    {
        frmLogin login = new frmLogin();
        string UserN = login.UName;
        string Pass;
        SqlCommand cmd = new SqlCommand("SELECT Login_Password FROM AdminLogin WHERE Login_Username = '"+UserN+"'", connection);

        try
        {
            connection.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            while(reader.Read())
            {
            Pass = reader["Login_Password"].ToString();

            if (tbOldPassword.Text == Pass)
                MessageBox.Show("Password matches");
            else
                MessageBox.Show("Password wrong");
            }
            reader.Close();
        }
        catch (SqlException ex)
        {
            MessageBox.Show(ex.Message, "Report", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);
        }
        finally
        {
            connection.Close();
        }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню