C#从数据库中随机选择不重复

时间:2015-01-13 10:23:59

标签: c# select

我有一个以随机顺序从数据库中选择的脚本。

脚本是自动检查的模拟。我想要的是,如果已经选择了一个问题,则不再提取。

我该怎么做?另外,如果没有选择3 checkboxes中的任何一个,当出现消息框时,它会选择另一个问题。 Select()使用数据库中的值初始化标签,我在Load表单中使用它。

以下是我迄今为止尝试过的代码:

private void select()
{
     string dataA = "SELECT * FROM questions order by rand()";
     MySqlCommand cmd = new MySqlCommand(dataA, index.connect);
     cmd.CommandType = CommandType.Text;
     using (index.connect)
     {
        index.connect.Open();
        MySqlDataReader rdr = cmd.ExecuteReader();
        try
        {
           if (rdr.Read())
           {
               label2.Text = rdr["question"].ToString();
               label2.AutoSize = true;
               label2.UseCompatibleTextRendering = true;
               label3.Text = rdr["answer1"].ToString();
               label4.Text = rdr["answer2"].ToString();
               label5.Text = rdr["answer3"].ToString();
               option1 = checkBox1.Checked;
               option2 = checkBox2.Checked;
               option3 = checkBox3.Checked;
            }
         }
         catch (Exception ex)
         {
             MessageBox.Show(ex.Message);
         }
         finally
         {
            index.connect.Close();
         }
      }
  }

private void button1_Click(object sender, EventArgs e) 
// in cazul in care raspunzi la o intrebare, 
//iar aceasta ramane, orice a-i raspunde, pune la incorect
{
    string dataA = "SELECT * FROM questions order by rand()";
    MySqlCommand cmd = new MySqlCommand(dataA, index.connect);
    cmd.CommandType = CommandType.Text;
    using (index.connect)
    {
        index.connect.Open();
        MySqlDataReader rdr = cmd.ExecuteReader();
        if (rdr.Read())
        {
            label2.Text = rdr["question"].ToString();
            label3.Text = rdr["answer1"].ToString();
            label4.Text = rdr["answer2"].ToString();
            label5.Text = rdr["answer3"].ToString();
            option1 = checkBox1.Checked;
            option2 = checkBox2.Checked;
            option3 = checkBox3.Checked;
            if (checkBox1.Checked == false && 
                checkBox2.Checked == false && 
                checkBox3.Checked == false)
            {
                MessageBox.Show("Bifati minim o casuta!");
                //imi selecteaza alta intrebare
                 return;
            }
            else
            {
               if ((option1.ToString() == rdr["option1"].ToString()) &&
                   (option2.ToString() == rdr["option2"].ToString()) && 
                   (option3.ToString() == rdr["option3"].ToString()))
               {
                    corect++;
                    label10.Text = corect.ToString();
                    checkBox1.Checked = false;
                    checkBox2.Checked = false;
                    checkBox3.Checked = false;
               }
               else
               {
                    incorect++;
                    label12.Text = incorect.ToString();
                    checkBox1.Checked = false;
                    checkBox2.Checked = false;
                    checkBox3.Checked = false;
               }
           }
       }
  }

1 个答案:

答案 0 :(得分:1)

您需要将已选择的问题排除在退还给您之外。

为此,您需要将方法返回的每个问题的ID存储在一个集合中,并使用该集合排除下一个选择的问题。

避免在数据库中使用标志,因为仅当只有一个应用程序实例在运行时才会起作用。如果有多个实例,则每个实例将提供不同的问题,并且应仅排除其收到的问题。

举例说明:

public class Question
{
    public int Id {get; set;}
    public string Text {get; set;}
    public Answer[] Answers {get; set;}
}

public class QuestionSelector
{
    private readonly List<int> _previousQuestionIds = new List<int>();

    public Question NextQuestion()
    {
        var query = "select top 1 * from Questions ";
        if(ids.Any())
        {
            var ids = String.Join(",", _previousQuestionIds.Select(id=>id.ToString()));
            query += "  where id not in (" + ids + ") ";
        }
        query += " order by rand()";
        var question = ParseQuestion(query);
        _previousQuestionIds.Add(question.Id);
        return question;
    }

    private Question ParseQuestion(string query)
    {
        // query the database and convert the data from the returned row
    }
}

上面的类只是在加载表单时创建它的一个实例,并调用NextQuestion()方法来加载下一个问题。它将以一个空的id集合开始,这意味着在第一次调用时它不会排除任何问题,但每次调用NextQuestion()方法时,它都会将返回的问题的id添加到列表中,并且下一次打电话的问题将被排除在外。