#c# #mysql #sql #visual-studio
#c# #mysql #sql #visual-studio
Вопрос:
У меня есть база данных со следующей таблицей:
Я пытаюсь получить роль текущего имени пользователя, чтобы я мог перенаправить этого человека на нужную страницу. Я попробовал это с помощью предложения if (acc.u_role == 1), но, к сожалению, это не работает.
public ActionResult Verify(User acc)
{
connectionString();
con.Open();
com.Connection = con;
com.CommandText = "select * from Users where u_username = '" acc.u_username "' and u_password ='" acc.u_password "'";
dr = com.ExecuteReader();
if (dr.Read())
{
if (acc.u_role == 1) {
con.Close();
return View("AdminHome");
}
else
{
con.Close();
return View("UserHome");
}
}
else
{
con.Close();
return View("Error");
}
}
Комментарии:
1. Во-первых, из базы данных в другую, вы не можете гарантировать, что ваш идентификатор роли будет равен 1. Вместо этого я бы просто вернул имя роли, связанной с этим пользователем, чтобы вы знали роль навсегда и основывали на ней свое перенаправление.
2. 3 кратких совета: 1: параметризуйте свой sql, 2:
connectionString()
это не подходящее название метода, используйте глаголы и описательные имена. 3: узнайте о try / catch / finally.
Ответ №1:
Где вы устанавливаете acc.u_role?
Похоже, что вы читаете данные, а затем не используете их. dr[5] должен содержать роль из базы данных
dr = com.ExecuteReader();
if (dr.Read())
{
if (dr[5] == 1) {
con.Close();
return View("AdminHome");
}
Ответ №2:
Я уже нашел решение для своего ответа, вот оно:
if (dr.Read())
{
if (Convert.ToInt32(dr["u_role"]) == 1) {
con.Close();
return View("AdminHome");
}
else
{
con.Close();
return View("UserHome");
}
}
else
{
con.Close();
return View("Error");
}
Комментарии:
1. То, что вы, вероятно, хотите использовать, — это ExecuteScalar(). Вам нужно только одно возвращаемое значение — u_role определенного пользователя. Извлечение слишком большого количества данных для последующей фильтрации в программе является очень распространенной ошибкой. Это прямо там, где не используются параметризованные запросы в ошибках, которых следует избегать.