#c# #oracle11g
#c# #oracle11g
Вопрос:
Я пытаюсь создать простую страницу входа в систему с помощью Visual Studio win form. У меня есть имя пользователя и пароль в качестве элементов управления текстовым полем.
вот событие, которое должно проверить, есть ли такой пользователь в базе данных:
if (con.State != ConnectionState.Open)
{
con.Open();
}
OracleCommand cmd = con.CreateCommand();
cmd.CommandText = "select staff_username, staff_password from staff_accounts";
cmd.CommandType = CommandType.Text;
OracleDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
if (dr.HasRows)
{
if (username.Text == dr["staff_username"].ToString() amp;amp; pass.Text == dr["staff_password"].ToString())
{
admin.ShowDialog();
}
else
{
label1.Text = "Error";
}
}
}
dr.HasRows
возвращает false, поэтому это означает, что cmd.CommandText = "select staff_username, staff_password from staff_accounts";
не возвращает строк, но в моей базе данных тот же запрос работает нормально.
мы будем признательны за любую помощь.
Комментарии:
1. Что вы подразумеваете под «не работает»? Пожалуйста, напишите, какое исключение вы получаете?
2. Никаких исключений не появляется. Просто ничего не происходит
3. он должен либо открыть новую форму, либо изменить текстовое значение label1 на error
4. Я предполагаю, что это причина cmd. CommandText … например, когда ему присваивается значение «выбрать 5 1 из dual», это работает, но когда ему присваивается значение «выбрать staff_username, staff_password из staff_accounts», он не возвращает строк
5. Я проверил это в своей базе данных, кажется, там все в порядке. он возвращает все
Ответ №1:
Вы должны проверить HasRows
свойство перед вызовом метода reader Read()
. Попробуйте:
if (dr.HasRows)
{
while (dr.Read())
{
....
Комментарии:
1. Еще лучше, просто не проверяйте
HasRows
вообще. В случае пустого результирующего набораRead
вернетfalse
, полностью пропуская цикл.2. @Alejandro, я полностью согласен, но я просто оставляю проверку HasRows, поскольку OP использует ее