孫偉
摘要:.net技術(shù)為用戶快速構(gòu)建程序提供了很大便捷,該文使用.net框架開發(fā)了一款輕量化考試系統(tǒng),針對小型考試提供應(yīng)用,即考即用。減少傳統(tǒng)考試的紙張和人力資源浪費(fèi),也符合如今綠色環(huán)保發(fā)展的新理念
關(guān)鍵詞:.net;GridView控件;DataList控件
中圖分類號:TP311 ? ? ? ?文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2020)28-0088-05
本文面向于各種專業(yè)小型考試,結(jié)合微軟的.net技術(shù)和SQL Server數(shù)據(jù)庫技術(shù),開發(fā)了一套小范圍小體積、搭建簡單、即用即考、即時評分匯總的輕量化在線考試系統(tǒng)。
本系統(tǒng)操作簡單,可按需要的出題規(guī)則組卷,能進(jìn)行多種學(xué)科、題型的考試。本系統(tǒng)操作上分為管理員操作與考生操作。管理員端負(fù)責(zé)導(dǎo)入管理考生數(shù)據(jù)、試題數(shù)據(jù),生成試卷,開始考試,考試過程管理,成績管理等操作。盡量簡化操作,以最小功能實現(xiàn)一場考試。
1 本系統(tǒng)文件結(jié)構(gòu)組成
數(shù)據(jù)庫文件1個:存儲登錄信息、題庫試卷信息、考試過程信息等,共6張數(shù)據(jù)表。
公共類文件1個:包含數(shù)據(jù)庫連接、執(zhí)行數(shù)據(jù)庫Sql命令、綁定控件方法等。
樣式表文件6個:管理整個系統(tǒng)外觀,網(wǎng)頁樣式。
根目錄文件2個:Web.config文件用于系統(tǒng)環(huán)境變量設(shè)置,如數(shù)據(jù)庫連接字符串、數(shù)據(jù)庫連接池大小;登錄文件Default.aspx即為首頁文件,用于考生登錄驗證。
前臺文件3個:分別為考試需知頁;考試頁,隨機(jī)抽題供考生答題;成績顯示頁,考生交卷后顯示該考生成績。
后臺文件11個:管理登錄頁;考生導(dǎo)入頁;考生管理頁;過程管理頁;成績查詢頁;試題導(dǎo)入頁;試題管理頁;試卷管理頁;此外還有管理員改密碼、操作說明、班級成績下載三個輔助頁。
本系統(tǒng)使用流程:管理員登錄后臺頁→導(dǎo)入考生數(shù)據(jù)→導(dǎo)入題庫→生成套題→考生于首頁登錄→考生在線考試→考試過程管理(考生死機(jī)重新登錄等操作)→考生交卷→成績?nèi)霂欤ㄋ锌忌痪砗螅Y(jié)束考試(考生將不能再登錄)→生成成績文件(可供下載或打印)→完畢。
2 本系統(tǒng)代碼實現(xiàn)
1)考生信息與試題信息導(dǎo)入頁中,主要使用了Fileupload控件進(jìn)行上傳文件操作,只支持Excel文件,使用數(shù)據(jù)庫控件DataTable讀取文件,Excel文件按規(guī)定格式來填寫,將出題權(quán)交給相關(guān)專業(yè)的老師,提高試題專業(yè)性。代碼節(jié)選如下:
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驅(qū)動 ? 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文件內(nèi)容,并生成一個DataTable提供給其它相關(guān)管理頁綁定。如果未能讀取成績,需先安裝驅(qū)動或重新設(shè)置規(guī)定樣式。
上傳事件代碼中,將對文件類型,內(nèi)容模式作出篩選判斷,如果類型不對,內(nèi)容為空或模式不符合將給出相應(yīng)提示,代碼略。
2)在后臺各個管理頁都使用了GridView控件。使用它的內(nèi)置事件對數(shù)據(jù)進(jìn)行管理操作。在頁中,還使用了DropDownList控件、TextBox控件、Button控件進(jìn)行數(shù)據(jù)查詢操作,可以讓管理員很方便地查找到要操作的數(shù)據(jù)。代碼節(jié)選如下:
protected void DropDlt1_SelectedIndexChanged(入口參數(shù)代碼,略) //根據(jù)下拉列表框選擇內(nèi)容,可按班級來顯示考生信息事件
{ ?Bj1=true ; //標(biāo)記變量,記錄是否操作過下拉列表框和查詢操作
Bj2 = false;
ddlstr ?= string.Format("select id,Name,idCard,clName from Tb_XueShen where clName='{0}' order by id desc ", //用于記錄查詢命令,以便分頁操作可以在查詢到的結(jié)果中操作,其中id及以后的單詞為字段名,Tb開頭為數(shù)據(jù)表名字
DropDlt1.SelectedValue.ToString());
cl.tabbind(GridView1,ddlstr, "id"); ?//根據(jù)下拉列表的選擇項,重新綁定GridView,顯示所需信息 ?}
protected void Btn_Clk1(入口參數(shù)代碼,略) ?//通配符查詢事件
{ ? Bj2 = true;Bj1 = false;
switch (DropDlt2 .SelectedIndex ) ?//可以按班級、學(xué)號、名字分別查詢
{ ? 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"); //查詢成功,重新綁定顯示數(shù)據(jù) ? }
GridView控件是一個很強(qiáng)大的數(shù)據(jù)源綁定控件,不但樣式豐富,更內(nèi)置了分頁,更新,刪除等事件,對數(shù)據(jù)庫操作非常方便簡單。在本系統(tǒng)中,大量使用了該控件來進(jìn)行數(shù)據(jù)庫信息管理。
3)成績管理頁中,當(dāng)成績?nèi)霂旌?,會以班級為單位生成一個文本文件供用戶下載,文件內(nèi)容為該班參加考試學(xué)生,該科目成績匯總。而文本文件作為最基礎(chǔ)的windows文件,基本任何電腦都可以打開,方便了后期成績的查看與打印,保存。該文件下載方式采用了分頁技術(shù),A頁用戶單擊下載后將要下載的文件名傳到B頁,B頁接收到后才進(jìn)行下載操作,避免了鏈接暴露的危險。代碼節(jié)選如下:
protected void Btn_Clk2(入口參數(shù)代碼,略)//成績生成文本文件事件
{ ? Random rd = new Random();//將信息寫入數(shù)據(jù)庫及文本文件中
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();//以數(shù)據(jù)流方式寫入
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();