stella bloom Ответов: 1

Хотите отобразить все вопросы и варианты


я хочу, чтобы он отображал вопрос до сих пор, пока я сделал массив,,, thnx

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

private void SelectedIndexChanged(object sender, EventArgs e)
        {
            

                SqlConnection conn = new SqlConnection();
                string cmdText = "my command";

                SqlDataAdapter da = new SqlDataAdapter(cmdText, conn);

                SqlCommand cmd = new SqlCommand(cmdText, conn);
                conn.ConnectionString = constring;

                try
                {
                    conn.Open();
                    
                    SqlDataReader rd = cmd.ExecuteReader();

                    
                        {
                            textBox1.Text = (rd["Question"].ToString());

                            radioButton4.Text = rd["opt4"].ToString();
                            radioButton1.Text = rd["opt1"].ToString();
                            radioButton2.Text = rd["opt2"].ToString();
                            radioButton3.Text = rd["opt3"].ToString();

                        }

                    }

                }
                catch (Exception exp)
                {
                    MessageBox.Show(exp.ToString());
                }
                finally
                {
                    conn.Close();
                }

            }

        }

[no name]

Мы понятия не имеем, что значит "не работает". Мы также не знаем, почему вы хотите, чтобы ваша база данных была уничтожена атакой SQL-инъекций.

stella bloom

ну, я хочу перемещаться, но db отображает самый последний добавленный вопрос, извините за любые ошибки, это мой ist yr с этим материалом si idk много ...

CHill60

Ваш код уязвим для атаки SQL-инъекций-используйте параметризованные запросы.
Зачем возвращаться к базе данных? Просто загрузите все соответствующие вопросы в таблицу данных и перемещайтесь туда и обратно с помощью индекса
Где код для следующей кнопки?
А что значит "не работает" означает?

stella bloom

не работает означает что я не могу отобразить все вопросы когда я нажимаю кнопку Далее он просто отображает самый последний добавленный

CHill60

Я предложил решение. ..смотреть ниже

CHill60

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

stella bloom

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

stella bloom

спасибо за решение ....

CHill60

Без проблем. Кроме того, обычно существуют лучшие способы работы с данными, чем использование массивов в .NET ... используйте массивы только в том случае, если вы не можете найти другого способа-в частности, проверьте списки :-)

1 Ответов

Рейтинг:
5

CHill60

- См. комментарии об уязвимости к атакам SQL-инъекций. Никогда не используйте сцепленные строки для создания команды SQL, вместо этого используйте параметризованные запросы (как показано ниже).

- Нет необходимости возиться с массивом, просто храните результаты чтения базы данных в DataTable.

- Использовать using как SqlConnection и SqlCommand реализуют IDisposable.

- Отделите проблемы чтения базы данных от заполнения пользовательского интерфейса

Я бы, наверное, сделал что-то вроде этого (предостережение - это непроверенное)

private DataTable quest = new DataTable();
private int lastQuest = -1;
  private DataTable GetQuestions(string difficulty, string subject)
  {
      //If one of the inputs is empty return the list of questions we currently have
      if (string.IsNullOrEmpty(difficulty) || string.IsNullOrEmpty(subject)) return quest;

      var dt = new DataTable();
      const string cmdText = "SELECT Question,Opt1,Opt2,Opt3,Opt4 from Questions where DiffLevel=@diff AND SubName= @subj";
      using (var conn = new SqlConnection(constring))
      {
          conn.Open();

          using(var cmd = new SqlCommand(cmdText, conn))
          {
              cmd.Parameters.AddWithValue("@diff", difficulty);
              cmd.Parameters.AddWithValue("subj", subject);

              var dr = cmd.ExecuteReader();
              dt.Load(dr);
          }

          conn.Close();
      }
      return dt;
  }

  private void PopulateQuestion(int questNo)
  {
      if (questNo > quest.Rows.Count - 1 || questNo < 0 ) return;

      textBox1.Text = quest.Rows[questNo]["Question"].ToString();
      lastQuest = questNo;  //NOTICE THIS !!
      radioButton1.Text = quest.Rows[questNo]["opt1"].ToString();
      radioButton2.Text = quest.Rows[questNo]["opt2"].ToString();
      radioButton3.Text = quest.Rows[questNo]["opt3"].ToString();
      radioButton4.Text = quest.Rows[questNo]["opt4"].ToString();
  }

  private void difflevel_SelectedIndexChanged(object sender, EventArgs e)
  {
      HandleIndexChanged();
  }

  private void subj_SelectedIndexChanged(object sender, EventArgs e)
  {
      HandleIndexChanged();
  }
  private void HandleIndexChanged()
  {
      quest = GetQuestions(difflevel.SelectedItem.ToString(), subj.SelectedItem.ToString());

      if (quest.Rows.Count > 0)
          PopulateQuestion(0); //Populate the first question
  }
  private void btnNext_Click(object sender, EventArgs e)
  {
      PopulateQuestion(q + 1);
  }
  private void btnPrev_Click(object sender, EventArgs e)
  {
      PopulateQuestion(q - 1);
  }


[EDIT-измененный код для использования глобального int lastQuest чтобы сохранить последний вопрос