随着计算机网络的普及基于数据库的B/S网上考试系统得到广泛地应用现以(C#)+SQL server(或ACCESS)为例说明开发网上考试系统的实现方法
一数据库的设计
建立数据库netexam在库中添加考生信息表StuInfo分别建立以下字段考号ExamId(c)(主键)考生姓名Name(c)是否登录考试LogYn(c)得分Score(c)随机生成的试题答案mca(c) (注:此处以多选题为例单选题判断题同理)添加多选题题库表mc建立以下字段题目question(c)四个选choice(c)choice(c)choice(c)choice(c)答案answer(c)(注:多选题答案用表示未选表示选择如选择ABD就用表示)
二考生登录
在此处将考生信息插入表StuInfo此处要防止考生重复登录!给指定唯一的考号并将考号字段ExamId(c)设为主键当重复登录时用Catch捕获错误给出相应提示部分代码如下(loginaspx)
private void ButOk_Click(object sender SystemEventArgs e)
{
SqlConnection StuConn=new SqlConnection(Data Source=localhost;Integrated Security=SSPI;
Initial Catalog=netexam);
SqlCommand LoginCmd=StuConnCreateCommand(); //可根据不同情况选择不同的数据库连接
LoginCmdCommandText=Insert into StuInfo(ExamIdName) values(+TxtIdTextTrim()++TxtNameTextTrim()+);
//将考号姓名插入相应字段其中TxtIdTxtName分别是输入考号和姓名的文本框
try
{
Session[Id]=TxtIdTextTrim();
StuConnOpen();
LoginCmdExecuteReader();
ResponseRedirect(testaspx);
}
catch(Exception) //捕获相应错误
{
ResponseWrite(<script language=\javascript\>+\n);
ResponseWrite(alert(\不能重复登录或考号姓名密码是否有误!\)+\n</script>);
}
}
三试题生成
防止考生刷新页面
由于加载试题页面时将从数据库中随机抽取试题所以应防止考生刷新面页(刷新页面会重新生成新的试题)方法是将表StuInfo中的LogYn字段默认值设为加载试题后设为交卷评分后设为加载试题页面时进行相应检查以防止页面的刷新代码如下(testaspx):
private void Page_Load(object sender SystemEventArgs e)
{
if(!IsPostBack)
{
QuestCmdCommandText=select LogYn from StuInfo where ExamId= + Session[Id]ToString()+;
QuestConnOpen();
SqlDataReader QuestRd=QuestCmdExecuteReader();
QuestRdRead();
if(QuestRd[LogYn]ToString()Trim()Equals()||QuestRd[LogYn]ToString()Trim()Equals())
//判断是否已加载试题或是否已评分
{
ResponseWrite(<script language=\javascript\>+\n);
ResponseWrite(alert(\不能刷新!请与管理员联系重新登录\)+\n</script>);
}
else
{
QuestCmdCommandText=update StuInfo set LogYn=; //已成功加载试题
QuestCmdExecuteReader();
}
}
}
随机生成试题
网上考试系统的关键是试题的随机生成即对于不同的计算机访问系统时将从题库中随机地抽取不同的试题
在此我们可使用SQL语句select top n * from mc order by newid()从题库中随机抽取n条记录其中newid()生成 uniqueidentifier 值(若是ACCESS数据库则用select top n * from mc order by rnd(id)其中id为自动编号字段)
在testaspx页面上放置一个Panel容器控件以便动态生成绑定到试题的控件并将从表mc中随机生成的试题答案写入表StuInfo表中的mca字段代码如下(testaspx):
private void Page_Load(object sender SystemEventArgs e)
{
if(!IsPostBack)
{
QuestCmdCommandText=select top * from mc order by newid();//以随机生成道题为例
QuestConnOpen();
QuestRd=QuestCmdExecuteReader();
while(QuestRdRead())
{
Literal LitTxt=new Literal();
Literal LitBl=new Literal();
CheckBoxList ChkMc=new CheckBoxList();
ChkMcID=ChkMc+iToString();
LitTxtText=iToString()+ +ServerHtmlEncode(QuestRd[Question]ToString())+<BR><Blockquote>;
LitBlText=</Blockquote>;
ChkMcFontSize=;
for(int j=;j<=;j++)
{
ChkMcItemsAdd(ServerHtmlEncode(QuestRd[Choice+jToString()]ToString()));
ChkMcItems[j]Value=jToString();
}
mcStr+=QuestRd[Answer]ToString()Trim(); //mcStr是存储随机生成试题答案的字符串变量
MyPanelControlsAdd(LitTxt);
MyPanelControlsAdd(ChkMc);
MyPanelControlsAdd(LitBl);
i++;
}
QuestCmdCommandText=update StuInfo set Mca=+mcStr+ where ExamId= +Session[Id]ToString()+; //将随机生成试题答案写入数据表
QuestConnOpen();
QuestRd=QuestCmdExecuteReader();
}
}
四交卷评分
当用户点击交卷按钮后应将用户的答题结果与试题答案进行比对并给出相应的分值写入数据表最后将表StuInfo中的LogYn字段设置为显示考试得分代码如下(testaspx):
private void ButSend_Click(object sender SystemEventArgs e)
{
for(int i=;i<=;i++) //由于随机生成了道题所以循环次
{
for(int j=;j<;j++)
if(RequestForm[ChkMc+iToString()+:+jToString()]!=null)
mcs+=; //mcs是存储考生所选答案的字符串变量已选用表示未选用表示
else
mcs+=;
}
QuestCmdCommandText=select mca from StuInfo where ExamId= +Session[Id]ToString()+;
QuestConnOpen();
SqlDataReader QuestRd=QuestCmdExecuteReader();
QuestRdRead();
int StuScore=; //存储得分的变量
for(i=;i<;i+=)
{
if(QuestRd[mca]ToString()Substring(i)Equals(mcsSubstring(i)))
StuScore+=; //从字段mca和mcs中每次取四个字符进行比对如相等则加上分
}
QuestCmdCommandText=update StuInfo set score=+StuScoreToString()+LogYn= where ExamId= + Session[Id]ToString()+and LogYn=; //设置已评分标志
QuestRd=QuestCmdExecuteReader();
ResponseRedirect(scoreaspx); //显示考试得分页面
}
限于篇幅在此只列出了实现网上考试系统的几个要点读者可根据自已的需要进一步完善相应的数据验证后台管理及界面设计