问题描述
下面是《asp.net项目开发全程实录》第七章在线考试从数据库中选择单选题和核对单选题答案。这样选择的试题在客户端试题的排列顺序是一样的,能正确核对答案计算成绩,相邻客户端很容易相互操答案。我想把它改成随机生成试题,我用'orderbynewid()代替'orderbyiddesc能随机生成试题了,客户端之间的试题排列顺序也不一样了。可是不能正确核对答案计算成绩。也就是说随机生成的题号与核对答案的题号不一致。因刚入门非常菜,根据下面代码请前辈具体地写出怎样修改。再送50分表示感谢。//从数据库中选择单选题case1:SqlDataAdaptermyadapter1=newSqlDataAdapter("select*"+"fromtb_Questionswhereque_type='单选题'andque_lessonid='"+dd1+"'andque_taotiid='"+dd2+"'orderbyiddesc",con);DataSetmyds1=newDataSet();myadapter1.Fill(myds1);DataList1.DataSource=myds1;DataList1.DataBind();//生成单选题题号for(inttID1=1;tID1<=DataList1.Items.Count;tID1++){LabellblSelect=(Label)DataList1.Items[tID1-1].FindControl("Label2");lblSelect.Text=tID1.ToString()+"、";}break;//核对单选题答案case3:SqlDataAdaptermyadapter3=newSqlDataAdapter("selectid,que_answer"+"fromtb_Questionswhereque_type='单选题'andque_lessonid="+dd1+"andque_taotiid="+dd2+"orderbyiddesc",con);DataSetmyds3=newDataSet();myadapter3.Fill(myds3);DataRow[]row1=myds3.Tables[0].Select();//计算单选题成foreach(DataRowanswer1inrow1){int_row1+=1;if(int_row1<=3){RadioButtonListrbl=(RadioButtonList)(DataList1.Items[int_row1-1].FindControl("RadioButtonList1"));if(rbl.SelectedValue==""){this.lblSel.Text="0";}else{if(answer1["que_answer"].ToString().Trim()==rbl.SelectedValue.ToString().Trim()){int_row1Point+=40/DataList1.Items.Count;this.lblSel.Text=int_row1Point.ToString();}}}}break;
解决方案
解决方案二:
你可以一次把数据取出来放在DataTable里面(包括答案)这样核对答案时用DataTable里面的数据就是说case3里面不用再newDataAdapter了,直接用case2里面的DataTable。
解决方案三:
DataRow[]row1=myds3.Tables[0].Select();问题估计出在这里!同意楼上的意见,你可以考虑使用同一个DATASET,不过看你的程序中使用的两个DATASET的内容基本是一致的,唯一的问题可能就是你的判断中的选择的行不正确,所以,你可以考虑使用同一个DATASET,那么你可以使用前面的行号来直接得到答案的结果进行判断。还有一种方式你可以考虑,就是这个题库应该是有个键值字段的,那么如果是我做的话,我会考虑前面讲问题列出来后,采用一个属性或者字段来保存这个键值,那么要判断答案是否正确的时候,就直接使用dataread通过键值来检索数据库然后来判断,因为那个是最快的数据读取方式!而且灵活!