我创建一个问题池,从那里选择随机问题以应用某种算法,无论如何,当我调试程序时,得到的索引都超出了数组错误的范围。

对我在说什么有一个清晰的想法,这是我要问的问题:

首先我定义类Gene代表问题

public class Gene
{
    public string question { get; set; }
    public string CLO { get; set; }
    public string type { get; set; }
    public string Answer { get; set; }
    public string mark { get; set; }
    public string chapter { get; set; }
    public Gene(string s, string t, string i, string a, string m, string c)
    {
        this.question = s;
        this.type = t;
        this.CLO = i;
        this.Answer = a;
        this.mark = m;
        this.chapter = c;

    }
}
List<Gene> QuestionList = new List<Gene>();


然后我从数据库提出问题

protected void DropDownList5_SelectedIndexChanged(object sender, EventArgs e)
{
    string sub = DropDownList5.Text;


    SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Sondos\Downloads\For the project\suz\ExamGenerationSystem.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
    string s = "select * FROM QuestionBank WHERE (Cource_Code = '" + DropDownList5.SelectedItem.Text + "') ORDER BY RAND()";
        SqlCommand cmd = new SqlCommand(s, con);
        SqlDataReader dr;
        con.Open();
        dr = cmd.ExecuteReader();
        dr.Read();
        while (dr.Read())
        {
            string ques = dr["Question"].ToString();
            string questype = dr["Question_Type"].ToString();
            string quesCLO = dr["CLO"].ToString();
            string quesAnswer = dr["Answer"].ToString();
            string quesMark = dr["Mark"].ToString();
            string quesChapter = dr["Chapter"].ToString();
            QuestionList.Add(new Gene(ques, questype, quesCLO, quesAnswer, quesMark, quesChapter));
        }
}


然后我问问题池

 Gene[] QuestionPool { get { return QuestionList.ToArray(); } }


当我尝试使用此方法随机选择问题时:

private System.Random randome;
private Gene GetRandomQuestion()
{
    int i = randome.Next(QuestionPool.Length);
    return QuestionPool[i];
}


错误索引超出数组范围

 return QuestionPool[i];

最佳答案

int i = randome.Next(QuestionPool.Length);


在此,如果QuestionPool为空,则该内容将变为int i = randome.Next(0),并返回零。
因此,


  返回QuestionPool [i]; //我变成0


由于QuestionPool为空且索引0没有任何内容,将抛出Index was outside the bounds

因此,请确保QuestionPool不为空。



在某些情况下会导致QuestionPool为空。


数据库中没有Cource_Code = DropDownList5.SelectedItem.Text记录
在这种情况下,第一次迭代时while (dr.Read())将是false,并且Gene不会添加任何QuestionList
在将任何GetRandomQuestion添加到Gene之前,将调用QuestionList




避免SQL注入

该行易受SQL注入攻击


  (Cource_Code ='“ + DropDownList5.SelectedItem.Text +”')


这意味着如果用户将SelectedItem的Text更改为类似

a'); Drop table QuestionBank; -- //Anything after -- becomes a comment


然后查询将变为

select * FROM QuestionBank WHERE (Cource_Code = 'a'); Drop table QuestionBank;


和您的表将被删除。

为避免这种情况,请参考此answer



列为阵列

如果有列表,则还可以按索引访问其项目。要获得其长度,可以使用Count。因此,GetRandomQuestion可以成为

private Gene GetRandomQuestion()
{
    int i = randome.Next(QuestionList.Count);
    return QuestionList[i];
}


如果您仅将QuestionPool用于此目的,则无需使用它。

10-06 09:21