Member 11644373 Ответов: 1

Какое-то время он показывает почтовый идентификатор, а какое-то-нет


Я показал UserMail, связанный с идентификатором пользователя . Но иногда он показывает ценность, а иногда-балнк. Я использовал сеанс для получения электронной почты.

Поскольку я новичок, может ли кто-нибудь помочь мне в этом или дать какие-либо предложения

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

private void Score_Page()
  {

          string id1 = Convert.ToString(Session["UserEmail"]);
          int id = Convert.ToInt32(Session["UserID"]);
          string connection = ConfigurationManager.AppSettings["connection"].ToString();
          SqlConnection con = new SqlConnection(connection);
          con.Open();
          SqlCommand com = new SqlCommand("SELECT  UserEmail ='" + id1 + "',QId,AnswerId,CASE WHEN AnswerResult = 0 THEN 'Incorrect' ELSE CASE WHEN AnswerResult = 1 THEN 'Correct' ELSE 'you have null value' END END FROM t_AnswerSheet WHERE UserId='" + id + "'", con);
          SqlDataAdapter sda = new SqlDataAdapter(com);
          DataTable dt = new DataTable();
          sda.Fill(dt);
          con.Close();
          GridView1.DataSource = dt;
          GridView1.DataBind();
   }

1 Ответов

Рейтинг:
9

Afzaal Ahmad Zeeshan

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

if(Session["UserEmail"] != null) {
   string id1 = Convert.ToString(Session["UserEmail"]);
   // Continue
} else {
   // Do not load anything, value is empty.
}

ASP.NET имеет политики для сеансов, плюс браузер также вступает в действие. Таким образом, вам нужно проверить, имеет ли сеанс это значение или нет. Далее вниз по течению вы также должны проверить, есть ли "id"допустимо в контексте или нет, например, почему условие в SELECT пункт, когда он может прийти в WHERE пункт? Эти вещи будут иметь большое значение, и если все пойдет правильно, то только тогда покажут, что DataTable в противном случае покажите ярлык, говорящий, что электронная почта не была найдена для этого пользователя; покажите идентификатор также и для целей отладки.

Кроме того, никогда не объединяйте SQL-запросы, они подвержены SQL-инъекция[^], и никто не любит инъекций. Ваш код должен быть таким,
// I removed the = '' from UserEmail in SELECT, add if needed; check CASE blocks too.
SqlCommand com = new SqlCommand(
"SELECT  UserEmail, QId, AnswerId, 
    CASE WHEN AnswerResult = 0 THEN 
       'Incorrect' 
    ELSE 
       CASE WHEN AnswerResult = 1 THEN 
         'Correct' 
       ELSE 'you have null value' 
       END 
    END 
 FROM t_AnswerSheet 
 WHERE UserId=@idparam", con);

Затем снова, наконец, передайте параметры этой команде и выполните ее. Вы можете посмотреть здесь,
c# с использованием параметров.AddWithValue в SqlDataAdapter-переполнение стека[^]

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