Это мой код, мне нужно получить 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
Дополнительная информация: Неправильная попытка чтения, когда данные отсутствуют.
reader.Read()
возвращают логическое значение, чтобы указать, действительно ли что-то было прочитано - вы не проверяете это вообще...
Измените свой код на:
if(reader.Read())
{
Pass = reader["Login_Password"].ToString();
if (tbOldPassword.Text == Pass)
MessageBox.Show("Password matches");
else
MessageBox.Show("Password wrong");
}
Если ничего не было прочитано, я думаю, что ваш пользователь не существует - я не уверен, что вы хотите сделать в этом случае... до вас
Но, пожалуйста, скажите, что вы не храните пароли в ясном тексте в своей базе данных !!!!
if (reader.HasRows)
также будет полезен для (предварительной) проверки наличия строк вообще. Мне нравится использовать его в первую очередь, потому что он не продвигает читателя к следующей / первой записи, поэтому у него нет побочных эффектов.
.HasRows
- имеет ли это какое-то преимущество по сравнению с простым вызовом .Read()
и проверкой результата, если строк нет?
Кажется, что в базе данных нет записи для имени пользователя, которое вы проверяете. Проверьте, возвращает ли получатель результат:
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();
}
}
}