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()";