2024年4月19日发(作者:)
DOI:10.13667/.52-1046/th.2010.05.028
计算机应用
·55·
基于2.0的网上考试系统随机抽题功能的实现和改进
陶喆,林财兴,何绪兰
(上海大学机械工程及自动化工程学院,上海200072)
摘要:随机抽题功能的实现是基于B/S网页考试系统的难点,通过newid()方法和临时表变量实现了较为复杂的不定项选择题随
机抽取的功能,并且利用了SQL的存储过程和UDF实现了整个抽题过程的封装和松耦合,并且由于SQL存储过程的执行高效性
提高了抽题的效率。
关键词:网上考试系统 newid 存储过程 UDF
中图分类号:TP311.131 文献标识码:A 文章编号:1002-6886(2010)05-0055-04
TheRealizationandImprovementoftheExaminationOnlineSystem'2.0
TAOZhe,LINCaixing,HEXulan
Abstract:Therealizationofthefunctionofrandomproblemsisthedifficultyoftheonlinetestsystem,bynewid()methodandthetem-
porarytablevariablecanhandleamoresophisticatedrandomfunction,andtheuseofSQLstoredproceduresandUDFachievesextractingand
packagingofthewholeprocess,eoftheefficiencyoftheimplementationofSQLstoredprocedures,improvingeffi-
ciencyofthepumpingefficiencyissues.
Keywords:onlinetestsystem;newid;storeprocedure;UDF
0 引言
社会的发展也要求着考试方式和教育形式的变化,越来
越多的远程教育的出现使得人们的课堂从教室中搬到了电
脑屏幕前,考试方式也从原先的纸质考卷变成了一份份电子
考卷。网上考试已成为了教育和考察方式变化中重要的一
环。
在人们渐渐接受这种网上考试方式的同时,也对其提出
了更多的要求:考试题型中选择题的选项的增加,不定项选择
题的加入,对大规模人数参考时随机抽题速度的保证,而其中
主要需要解决的问题就是随机抽题功能。
QuestionTab表中各个
字段解释:
QuestionID:题库中每
道考题的一个唯一的编号;
Subject:考题所属的科
目,例如可以有语文,数学
等;
Chapter:考题所属科目
中的第几章节;
Category:考题的难度
系数;
Style:考题的分类,多选,单选还是不定项选择题;
Question:考题的题目;
Rights:考题的答案;
Op1,Op2,Op3,Op4,Op5,Op6,Op7:考题的七个选项;
Explains:对考题答案的解析;
CreateDate:考题创建的时间;
State:表示考题需不需要更新;
Creator:考题的出题者;
Abstract:考题摘要。
1.3随机抽题的功能分析
本文针对不定项选择题来进行功能分析,而单项选择题
和多项选择题都是不定项选择题的特殊情况。经过分析不
1 抽题要求和实现原理分析
1.1开发平台及选择
由于考虑到传统的基于C/S的网上考试系统需要在客
户端安装应用程序,不是十分方便,因此采用B/S的结构进
行网上考试系统的设计,客户端只需要浏览器就可以进行考
试。开发平台采用2.0,数据库使用SQLServer。
1.2存放题库的QuestionTab表
因为考虑到需要解决的是随机抽题的问题,对于网上考
试系统所牵涉到的数据库表不一一介绍,只对存放题库的
QuestionTab表进行简单的介绍,QuestionTab表中每一条记录
都是包含着一道考题的信息。
作者简介:陶喆(1986-),男,在读硕士,主要研究方向:CIMS。
收稿日期:2010-4-13
·56·
现代机械 2010年第5期
}
sqlstr+="selectfrom@temptableorderbynewid()";
ds=aSet(sqlstr);
其中myOperation是自定义的一个类,它有一个方法Get-
DataSet,此方法根据其中的形参sqlstring,先建立数据库连接
调用sqlstring中的SQL语句,并将得到的结果集填充到一个
DataSet中,此方法返回一个包含对应操作的结果集的Data-
Set。
2.2考题选项的随机排列实现
要实现考题选项的随机排列,实际上就是实现一个呈现
在页面上的选项的随机排列。考题的题目和选项都是放在
一个DataList类的dataList实例中的,dataList和返回的结果
集ds进行绑定后,用datalist中的label绑定ds中的Question
字段就能动态的显示随机抽取考题的题目了。而不定项选
择题中的选项有多个,本文中考虑的是七个选项,所以需要在
datalist中再增加控件CheckBoxList,实例名为cbl,利用它的I-
方法完成选项的随机排列功能。具体代码如下:
ArrayListmyList=newArrayList();
("op1");("op2");("
op3");("op4");("op5");myList.
Add("op6");("op7");
string[]options;
options=and(myList);
privatevoidBindExamPaper(string[]options,DataSetds)
for(intj=0;j<;j++)
{
switch(j)
{
case0:
initAnswer="A";
break;
case1:
initAnswer="B";
break;
case2:
initAnswer="C";
break;
case3:
initAnswer="D";
break;
case4:
initAnswer="E";
break;
case5:
initAnswer="F";
定项选择题的随机抽题功能需要满足以下要求:
1)从题库中所抽取的题目数量要和考试要求的总数量
一样;
2)从题库中所抽取的对应科目和章节的题目数量要和
考试要求一样;
3)从题库中所抽取的题目不能有重复;
4)抽取出来的题目要进行随机排序而且题目的选项也
需要进行随机排序。
1.4实现的基本原理
由于每次考试都是只考一个科目和此科目中的多个章
节,如要实现随机抽取考题的功能,需要在每个章节中随机的
抽取指定的题目数,然后将每个章节所抽取的题目组合在一
起再次进行随机排序最后形成试卷。
考虑到动态SQL语句newid()可以对从SQL中得到的
结果集进行随机的排序后返回新的结果集,而表变量可以存
放SQL中的结果集,因而我们可以先用newid()返回每个章
节中随机抽取的考题的结果集,将这些结果集相加放入表变
量中,再对表变量使用一次newid(),就可以返回我们所需要
的结果集。
2 随机抽题功能的具体实现
2.1考题题目的随机抽取实现
网上考试系统已定义有三个方法GetSubject,GetChapter-
Name(),GetExamChapterCount(),这三个方法分别获得当次
考试中的对应科目,对应科目中考题所需要牵涉到的章节名
称和对应章节中所包含的考题数,分别返回三个变量String
类型的subject,ArrayList类型的chapter和examChapterCount。
根据变量subject和chapter[0]中的值去确定QuestionT-
ab表中哪些记录行是满足当次考试的要求的,对这些结果集
用newid()进行随机排序,再从返回的结果集中利用和chap-
ter[0]对应的examChapterCount[0]变量中的值用top命令来
确定到底要在这些结果集中选取多少行,将根据examChap-
terCount[0]的值筛选后的结果集加入到临时表变量temptable
中,然后按上述的相同步骤遍历chapter和examChapterCount
中所有的元素后,将获得的表变量temptable用newid()进行
再次的随机排序返回的结果集就是符合要求的试题。
具体代码如下:
stringsqlstr="declare@temptabletable(QuestionID
bigintnotnullprimarykey)";
for(inti=0;i<;i++)
{sqlstr+="insert@temptable(QuestionID)select
top"+32(examChapterCount[i]);
sqlstr+="QuestionIDfromQuestionTabwhereSubject
=`"+subject+"'andChapter=`"+chapter[i].ToS-
tring();
sqlstr+="'orderbynewid()";

发布评论