基于.net的轻量化考试系统
2020-12-14孙伟
孙伟
摘要:.net技术为用户快速构建程序提供了很大便捷,该文使用.net框架开发了一款轻量化考试系统,针对小型考试提供应用,即考即用。减少传统考试的纸张和人力资源浪费,也符合如今绿色环保发展的新理念
关键词:.net;GridView控件;DataList控件
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2020)28-0088-05
本文面向于各种专业小型考试,结合微软的.net技术和SQL Server数据库技术,开发了一套小范围小体积、搭建简单、即用即考、即时评分汇总的轻量化在线考试系统。
本系统操作简单,可按需要的出题规则组卷,能进行多种学科、题型的考试。本系统操作上分为管理员操作与考生操作。管理员端负责导入管理考生数据、试题数据,生成试卷,开始考试,考试过程管理,成绩管理等操作。尽量简化操作,以最小功能实现一场考试。
1 本系统文件结构组成
数据库文件1个:存储登录信息、题库试卷信息、考试过程信息等,共6张数据表。
公共类文件1个:包含数据库连接、执行数据库Sql命令、绑定控件方法等。
样式表文件6个:管理整个系统外观,网页样式。
根目录文件2个:Web.config文件用于系统环境变量设置,如数据库连接字符串、数据库连接池大小;登录文件Default.aspx即为首页文件,用于考生登录验证。
前台文件3个:分别为考试需知页;考试页,随机抽题供考生答题;成绩显示页,考生交卷后显示该考生成绩。
后台文件11个:管理登錄页;考生导入页;考生管理页;过程管理页;成绩查询页;试题导入页;试题管理页;试卷管理页;此外还有管理员改密码、操作说明、班级成绩下载三个辅助页。
本系统使用流程:管理员登录后台页→导入考生数据→导入题库→生成套题→考生于首页登录→考生在线考试→考试过程管理(考生死机重新登录等操作)→考生交卷→成绩入库(所有考生交卷后)→结束考试(考生将不能再登录)→生成成绩文件(可供下载或打印)→完毕。
2 本系统代码实现
1)考生信息与试题信息导入页中,主要使用了Fileupload控件进行上传文件操作,只支持Excel文件,使用数据库控件DataTable读取文件,Excel文件按规定格式来填写,将出题权交给相关专业的老师,提高试题专业性。代码节选如下:
Public DataTable GetExcelDatatable(string file_Url)
{string Pro_String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='excel 12.0.0; Hdr=NO; Imex=1'"; //忽略栏位、只读模式
// 请先安装Microsoft.ACE.OLEDB.12.0驱动 DataTable dt = null;
OleDbConnection conn = new OleDbConnection(string.Format(Pro_String, file_Url)); conn.Open();
DataTable sTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); string strSql = "select * from [Sheet1$]";
OleDbDataAdapter da = new OleDbDataAdapter(strSql, conn);
DataSet ds = new DataSet();
da.Fill(ds);
dt = ds.Tables[0];
return dt; }
本段代码声名一个方法,功能为读取上传好的Excel文件内容,并生成一个DataTable提供给其它相关管理页绑定。如果未能读取成绩,需先安装驱动或重新设置规定样式。
上传事件代码中,将对文件类型,内容模式作出筛选判断,如果类型不对,内容为空或模式不符合将给出相应提示,代码略。
2)在后台各个管理页都使用了GridView控件。使用它的内置事件对数据进行管理操作。在页中,还使用了DropDownList控件、TextBox控件、Button控件进行数据查询操作,可以让管理员很方便地查找到要操作的数据。代码节选如下:
protected void DropDlt1_SelectedIndexChanged(入口参数代码,略) //根据下拉列表框选择内容,可按班级来显示考生信息事件
{ Bj1=true ; //标记变量,记录是否操作过下拉列表框和查询操作
Bj2 = false;
ddlstr = string.Format("select id,Name,idCard,clName from Tb_XueShen where clName='{0}' order by id desc ", //用于记录查询命令,以便分页操作可以在查询到的结果中操作,其中id及以后的单词为字段名,Tb开头为数据表名字
DropDlt1.SelectedValue.ToString());
cl.tabbind(GridView1,ddlstr, "id"); //根据下拉列表的选择项,重新绑定GridView,显示所需信息 }
protected void Btn_Clk1(入口参数代码,略) //通配符查询事件
{ Bj2 = true;Bj1 = false;
switch (DropDlt2 .SelectedIndex ) //可以按班级、学号、名字分别查询
{ case 0: { textstr = string.Format("select id,Name,idCard,clName from Tb_XueShen where id like '%{0}%' order by id desc ", Tt_Box1.Text .ToString());break ;} //使用通配符查詢,更精确
case 1: { textstr = string.Format("select id,Name,idCard,clName from Tb_XueShen where Name like '%{0}%' order by id desc ", Tt_Box1.Text.ToString()); break; ;}
case 2: { textstr = string.Format("select id,Name,idCard,clName from Tb_XueShen where clName like '%{0}%' order by id desc ", Tt_Box1.Text.ToString()); break; ;}
case 3: { textstr = string.Format("select id,Name,idCard,clName from Tb_XueShen where idCard like '%{0}%' order by id desc ", Tt_Box1.Text.ToString()); break; ;} }
Tt_Box1.Text = null;
cl.tabbind(GridView1, textstr , "id"); //查询成功,重新绑定显示数据 }
GridView控件是一个很强大的数据源绑定控件,不但样式丰富,更内置了分页,更新,删除等事件,对数据库操作非常方便简单。在本系统中,大量使用了该控件来进行数据库信息管理。
3)成绩管理页中,当成绩入库后,会以班级为单位生成一个文本文件供用户下载,文件内容为该班参加考试学生,该科目成绩汇总。而文本文件作为最基础的windows文件,基本任何电脑都可以打开,方便了后期成绩的查看与打印,保存。该文件下载方式采用了分页技术,A页用户单击下载后将要下载的文件名传到B页,B页接收到后才进行下载操作,避免了链接暴露的危险。代码节选如下:
protected void Btn_Clk2(入口参数代码,略)//成绩生成文本文件事件
{ Random rd = new Random();//将信息写入数据库及文本文件中
DateTime sj=DateTime.Now;
string file_Name = sj.Year.ToString() + sj.Month.ToString() + sj.Day.ToString() + sj.Hour.ToString() + sj.Minute.ToString() + sj.Second.ToString() + rd.Next(10, 99).ToString();//生成唯一文件名
FileInfo mf = new FileInfo(Server.MapPath("ks_file\\") + file_Name + ".txt");
StreamWriter sw = mf.CreateText();//以数据流方式写入
sw.WriteLine("成绩信息");
sw.WriteLine();
string sqlds = string.Format("select * from Tb_kscj where clName='{0}' and ttName='{1}'", DropDlt3.SelectedValue.ToString(), DropDlt4.SelectedValue.ToString());
DataSet ds = cl.ds(sqlds);
if (ds == null)
else
{ foreach(DataRow dh in ds.Tables[0].Rows)
{ string itmText = dh["id"].ToString();
itmText += dh["Name"].ToString();
itmText += dh["idCard"].ToString();
itmText += dh["ydScore"].ToString();
itmText += dh["ttName"].ToString();