Member 13820395 Ответов: 1

Онлайн-вопросник


я пытаюсь вычислить отметки каждого вопроса, но как и когда происходит приращение, он загружает первый вопрос снова и снова, и если я дам переменную как 2, она никогда не войдет в то место, где вычисляются отметки . если ii повторяется с вопросом 1 то нам нужно ans для следующего вопроса с предыдущим вопросом так как он снова загружается Вопрос 1

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

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Data.SqlClient;



namespace trial__
{
    public partial class Form1 : Form
    {
        public int incre = 1;
        public int b;
        public string y;
        public string z;
        public int marks;

        public Form1()
        {
            InitializeComponent();
            radioButton1.TabStop = false;
            radioButton2.TabStop = false;
            radioButton3.TabStop = false;
            radioButton4.TabStop = false;
           
            marks = 0;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //
            String Source = "xxxx";            
            SqlConnection con_2 = new SqlConnection(Source);
            {
                con_2.Open();
                MessageBox.Show("connected to db");
                string a = incre.ToString();
                string sqlSelectQuery = @"SELECT *FROM [Table]";
                SqlCommand cmd = new SqlCommand(sqlSelectQuery, con_2);
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    label1.Text = (dr["ques"].ToString());
                    textBox1.Text = (dr["sl"].ToString());
                    radioButton1.Text = (dr["op A"].ToString());
                    radioButton2.Text = (dr["op B"].ToString());
                    radioButton3.Text = (dr["op C"].ToString());
                    radioButton4.Text = (dr["op D"].ToString());
                    
                  
                }
            }
            con_2.Close();
           
        }

        private void button2_Click(object sender, EventArgs e)
        {
            string a = incre.ToString();
            String Source ="xxxx";
            SqlConnection con_2 = new SqlConnection(Source);
            {
                con_2.Open();
              
                string sqlSelectQuery = @"SELECT *FROM [Table] WHERE sL=" + a;
                SqlCommand cmd = new SqlCommand(sqlSelectQuery, con_2);
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    label1.Text = (dr["ques"].ToString());
                    textBox1.Text = (dr["sl"].ToString());
                    radioButton1.Text = (dr["op A"].ToString());
                    radioButton2.Text = (dr["op B"].ToString());
                    radioButton3.Text = (dr["op C"].ToString());
                    radioButton4.Text = (dr["op D"].ToString());


                    if (radioButton1.Checked == true)
                    {
                        y = dr["ans"].ToString();
                        z = dr["marks"].ToString();
                        int bi = Convert.ToInt32(z);
                        
                        //ans.Text = "meg";
                        if (radioButton1.Text == y)
                        {

                            marks = marks +bi;
                        }


                    }
                    if (radioButton2.Checked == true)
                    {
                        string g = (dr["ans"].ToString());
                        string h = dr["marks"].ToString();
                        int bd = Convert.ToInt32(h);
                        

                        if (radioButton2.Text == g)

                        {
                            marks = marks + bd;
                        }


                    }

                    if (radioButton3.Checked == true)
                    {
                        string g = (dr["ans"].ToString());
                        string h = dr["marks"].ToString();
                        int bk = Convert.ToInt32(h);


                        if (radioButton3.Text == g)

                        {
                            marks = marks + bk;
                        }


                    }

                    if (radioButton4.Checked == true)
                    {
                        string g = (dr["ans"].ToString());
                        string h = dr["marks"].ToString();
                        int bl = Convert.ToInt32(h);


                        if (radioButton4.Text == g)

                        {
                            marks = marks + bl;
                        }


                    }


                }

            }
            
            con_2.Close();
            incre++;
            radioButton1.Checked = false;
            radioButton2.Checked = false;
            radioButton3.Checked = false;
            radioButton4.Checked = false;

Richard Deeming

string sqlSelectQuery = @"SELECT *FROM [Table] WHERE sL=" + a;


Не делай этого так! В то время как в данной конкретной ситуации ничего плохого не произойдет, написание такого кода может и приведет к тому, что SQL-инъекция[^] факторы уязвимости.

НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

using (SqlCommand cmd = new SqlCommand("SELECT * FROM [Table] WHERE sL = @sL", con_2))
{
    cmd.Parameters.AddWithValue("@sL", incre);
    
    using (SqlDataReader dr = cmd.ExecuteReader())
    {
        ...
    }
}

Richard Deeming

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

Если вам нужно сохранить значение между запросами, рассмотрите возможность использования view-state вместо этого:

public int incre
{
    get { return (int?)ViewState["incre"] ?? 1; }
    set { ViewState["incre"] = value; }
}

1 Ответов

Рейтинг:
1

OriginalGriff

Без вашей базы данных мы не сможем запустить ваш код, и это именно то, что нужно здесь - вы не можете решить, что происходит не так, не запустив код и не посмотрев на переменные, как это происходит. Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Как вы его используете, зависит от вашей компиляторной системы, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!

Но... ваш код "проверьте метки" довольно странный. Вы, по-видимому, читаете текущий вопрос из базы данных и устанавливаете соответствующие ему тексты меток, а затем сразу же помечаете его на основе последнего набора ответов пользователей.
Вероятно, вам было бы лучше разделить это на два отдельных метода: один для пометки текущего вопроса, а второй для загрузки конкретного вопроса. Вызовите второй из вашего обработчика событий загрузки, чтобы настроить все, затем в вашем событии нажатия кнопки, сначала вызовите eth, чтобы отметить его, а затем второй, чтобы загрузить новый вопрос. Это просто делает его более ясным, что происходит, и легче поддерживать и даже развивать!