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