Member 14183767 Ответов: 1

Как перенаправить на страницу на основе значения в столбце БД


у меня есть страница, где два разных отдела будут входить в систему под названием 1.отходы и 2.окружающая среда. я хочу, чтобы страница перенаправлялась на определенную страницу, если отдел пользователей-это отходы, а также на другую страницу, если отдел пользователей-это среда. в моей регистрационной таблице есть столбцы имя, фамилия , адрес электронной почты , пароль и отдел

если отдел = отходы
Перенаправление на страницу 1 else
если отдел = окружающая среда
Перенаправление на страницу 2

я получаю сообщение об ошибке "исключение типа 'System.IndexOutOfRangeException' произошло в System.Data.dll но не был обработан в пользовательском коде"

Не знаю, как реализовать это в следующем коде:

Что я уже пробовал:
Код

Что я уже пробовал:

SqlConnection con = new SqlConnection(strConnString);
SqlCommand cmd = new SqlCommand("select * from [dbo].[PB_Register] where pb_Email= @Login_Email and pb_Password=@Login_Password", con);
cmd.Parameters.AddWithValue("@Login_Email",Login_Email.Text);
cmd.Parameters.AddWithValue("@Login_Password", Login_Password.Text);  

Session["Username"] = Login_Email.Text;

con.Open();
SqlDataReader rd = cmd.ExecuteReader();

if (rd.HasRows) {
   
    rd.Read();
       if (rd["Departmet"].ToString() == "EPIP")
                Response.Redirect("UPLOAD.aspx");
            else
                if (rd["Departmet"].ToString() == "Waste")
                Response.Redirect("EMAIL_FILE.aspx");  
            


} else {

    ClientScript.RegisterStartupScript(GetType(), "alert", "alert('Username or Password incorrect');", true);

}  
}

ZurdoDev

Шаг 1-это понять, что делает ваш код. Тогда делать то, что вы хотите сделать, очень легко.

Отдел пишется неправильно, поэтому он не может найти его в rd.

Member 14183767

это все еще дает мне ту же ошибку , это моя страница входа в систему, я хотел бы, чтобы код проверял, какой отдел находится в PB_Register для каждого пользователя и перенаправлял на соответствующую страницу

ZurdoDev

Опять же, вам нужно сначала узнать, что делает код.

Вызов rd = cmd.ExecuteReader() выполнит инструкцию sql, которая у вас есть. Если вы хотите получить доступ к столбцу в результате, то вы можете сделать это с помощью rd["columnName"].Метод toString().

Member 14183767

теперь я понимаю, что он делает, спасибо за это! но проблема в том, что даже когда я использовал решение ur, я все равно получаю ошибку, которая сбивает меня с толку, plz help я все еще учусь

ZurdoDev

Значит, вы набрали что-то не то. Каково имя столбца в таблице PB_Register, который вы хотите проверить?

Member 14183767

Отдел

ZurdoDev

Вы неправильно написали его в приведенном выше коде. Итак, исправьте это, и если вы получите ошибку, то скажите нам, какая строка кода вызвала ошибку и в чем она заключается.

Member 14183767

я исправил, что он выдает ошибку на этом коде : if(rd["Departmet"].ToString() == "EPIP")

ZurdoDev

и в чем же ошибка?

Member 14183767

- Исключение типа "система".IndexOutOfRangeException' произошло в System.Data.dll но не был обработан в пользовательском коде" дополнительная информация 'Department'

ZurdoDev

IndexOutOfRangeException, это означает, что столбец, на который вы ссылаетесь по индексу (rd["Department"]), не существует.

Откройте Sql Server Management Studio и запустите
выберите * из [dbo].[PB_Register]

Member 14183767

он существует я только что проверил

ZurdoDev

Тогда ваш код указывает на другую базу данных или вы все еще набрали его неправильно. Ошибки не лгут.

Что-то не так, и я не вижу, что вы делаете, поэтому вам придется найти это.

Richard Deeming

И почему вы заново изобретаете колесо? ASP.NET имеет несколько совершенно хороших встроенных систем аутентификации - например, Личность ASP.NET [^]

1 Ответов

Рейтинг:
12

MadMyche

Самым небрежным способом было бы схватить это в течение месяца. WHILE петля в какой-то вариации этого

if (rd.HasRows) {
  while (rs.Read()) {
    string RedirectURL = rd["ColumnName"];
  }
}
Response.Redirect(RedirectURL);


Я бы, вероятно, переделал это, чтобы быть чем-то более похожим на это; вам нужно только одно значение из одной строки, так что ExecuteScalar это было бы гораздо эффективнее. А что происходит, если они не входят ни в одну из групп? Для этого я сделал исключение.
Возможно вам придется исправить некоторые опечатки так как у меня нет IDE проверяющей мой набор текста
SqlConnection con = new SqlConnection(strConnString);

// Just grab the column you need
SqlCommand cmd = new SqlCommand("SELECT Departmet FROM [dbo].[PB_Register] WHERE pb_Email= @Login_Email AND pb_Password=@Login_Password", con);

cmd.Parameters.AddWithValue("@Login_Email",Login_Email.Text);
cmd.Parameters.AddWithValue("@Login_Password", Login_Password.Text);  

Session["Username"] = Login_Email.Text;

con.Open();

// SqlDataReader rd = cmd.ExecuteReader();
var DepartmentName = cmd.ExecuteScalar();

if (DepartmentName != null) {
  switch(DepartmentName.ToSting()) {
    case "EPIP" : Response.Redirect("UPLOAD.aspx"); break
    case "Waste" : Response.Redirect("EMAIL_FILE.aspx"); break
    default: throw new ArgumentOutOfRangeException("Department", "The department does not have an assigned path"); break
  } 
} else {
  ClientScript.RegisterStartupScript(GetType(), "alert", "alert('Username or Password incorrect');", true);

}


Member 14183767

спасибо тебе, Мадмыч, что это работает!!!!

MadMyche

Пожалуйста. Пожалуйста, отметьте это как решение и подумайте о том, чтобы оценить его также.