利用ASP.NET構建網上考試系統
隨著計算機網絡的普及,基于數據庫的B/S網上考試系統得到廣泛地應用,現以ASP.net(C#)+SQL server(或ACCESS)為例說明開發網上考試系統的實現方法。
一、數據庫的設計:
建立數據庫netexam,在庫中添加考生信息表StuInfo,分別建立以下字段:考號ExamId(c)(主鍵)、考生姓名Name(c)、是否登錄考試LogYn(c)、得分Score(c)、隨機生成的試題答案mca(c) (注:此處以多選題為例,單選題、判斷題同理)。添加多選題題庫表mc,建立以下字段:題目question(c)、四個選choice1(c)、choice2(c)、choice3(c)、choice4(c)、答案answer(c)(注:多選題答案用0表示未選,1表示選擇,如選擇ABD就用1101表示)。
二、考生登錄:
在此處將考生信息插入表StuInfo,此處要防止考生重復登錄!給指定唯一的考號,并將考號字段ExamId(c)設為主鍵,當重復登錄時,用Catch捕獲錯誤,給出相應提示,部分代碼如下(login.aspx):
三、試題生成:
1、防止考生刷新頁面:
由于加載試題頁面時將從數據庫中隨機抽取試題,所以應防止考生刷新面頁(刷新頁面會重新生成新的試題)。方法是將表StuInfo中的LogYn字段默認值設為0,加載試題后設為1,交卷評分后設為2,加載試題頁面時進行相應檢查,以防止頁面的刷新,代碼如下(test.aspx):
2、隨機生成試題:
網上考試系統的關鍵是試題的隨機生成,即對于不同的計算機訪問系統時將從題庫中隨機地抽取不同的試題。
在此我們可使用SQL語句"select top n * from mc order by newid()"從題庫中隨機抽取n條記錄,其中newid()生成 uniqueidentifier 值(若是ACCESS數據庫則用"select top n * from mc order by rnd(id)",其中id為自動編號字段)。
在test.aspx頁面上放置一個Panel容器控件,以便動態生成綁定到試題的控件,并將從表mc中隨機生成的試題答案寫入表StuInfo表中的mca字段,代碼如下(test.aspx):
四、交卷評分:
當用戶點擊交卷按鈕后,應將用戶的答題結果與試題答案進行比對,并給出相應的分值寫入數據表,最后將表StuInfo中的LogYn字段設置為2,顯示考試得分,代碼如下(test.aspx):
限于篇幅,在此只列出了實現網上考試系統的幾個要點,讀者可根據自已的需要進一步完善相應的數據驗證、后臺管理及界面設計。
一、數據庫的設計:
建立數據庫netexam,在庫中添加考生信息表StuInfo,分別建立以下字段:考號ExamId(c)(主鍵)、考生姓名Name(c)、是否登錄考試LogYn(c)、得分Score(c)、隨機生成的試題答案mca(c) (注:此處以多選題為例,單選題、判斷題同理)。添加多選題題庫表mc,建立以下字段:題目question(c)、四個選choice1(c)、choice2(c)、choice3(c)、choice4(c)、答案answer(c)(注:多選題答案用0表示未選,1表示選擇,如選擇ABD就用1101表示)。
二、考生登錄:
在此處將考生信息插入表StuInfo,此處要防止考生重復登錄!給指定唯一的考號,并將考號字段ExamId(c)設為主鍵,當重復登錄時,用Catch捕獲錯誤,給出相應提示,部分代碼如下(login.aspx):
private void ButOk_Click(object sender, System.EventArgs e) { ... SqlConnection StuConn=new SqlConnection("Data Source=localhost;Integrated Security=SSPI; Initial Catalog=netexam"); SqlCommand LoginCmd=StuConn.CreateCommand(); //可根據不同情況選擇不同的數據庫連接 ... LoginCmd.CommandText="Insert into StuInfo(ExamId,Name) values('"+TxtId.Text.Trim()+"','"+TxtName.Text.Trim()+"')"; //將考號、姓名插入相應字段,其中TxtId,TxtName分別是輸入考號和姓名的文本框 try { ... Session["Id"]=TxtId.Text.Trim(); StuConn.Open(); LoginCmd.ExecuteReader(); Response.Redirect("test.aspx"); } catch(Exception) //捕獲相應錯誤 { Response.Write("<script language="javascript">"+""); Response.Write("alert("不能重復登錄,或考號、姓名、密碼是否有誤!")"+"</script>"); } ... } |
三、試題生成:
1、防止考生刷新頁面:
由于加載試題頁面時將從數據庫中隨機抽取試題,所以應防止考生刷新面頁(刷新頁面會重新生成新的試題)。方法是將表StuInfo中的LogYn字段默認值設為0,加載試題后設為1,交卷評分后設為2,加載試題頁面時進行相應檢查,以防止頁面的刷新,代碼如下(test.aspx):
private void Page_Load(object sender, System.EventArgs e) { if(!IsPostBack) { ... QuestCmd.CommandText="select LogYn from StuInfo where ExamId= '"+ Session["Id"].ToString()+"'"; QuestConn.Open(); SqlDataReader QuestRd=QuestCmd.ExecuteReader(); QuestRd.Read(); if(QuestRd["LogYn"].ToString().Trim().Equals("1")||QuestRd["LogYn"].ToString().Trim().Equals("2")) //判斷是否已加載試題或是否已評分 { ... Response.Write("<script language="javascript">"+""); Response.Write("alert("不能刷新!請與管理員聯系,重新登錄。")"+"</script>"); ... } else { ... QuestCmd.CommandText="update StuInfo set LogYn='1'"; //已成功加載試題 QuestCmd.ExecuteReader(); ... } } ... } |
2、隨機生成試題:
網上考試系統的關鍵是試題的隨機生成,即對于不同的計算機訪問系統時將從題庫中隨機地抽取不同的試題。
在此我們可使用SQL語句"select top n * from mc order by newid()"從題庫中隨機抽取n條記錄,其中newid()生成 uniqueidentifier 值(若是ACCESS數據庫則用"select top n * from mc order by rnd(id)",其中id為自動編號字段)。
在test.aspx頁面上放置一個Panel容器控件,以便動態生成綁定到試題的控件,并將從表mc中隨機生成的試題答案寫入表StuInfo表中的mca字段,代碼如下(test.aspx):
private void Page_Load(object sender, System.EventArgs e) { if(!IsPostBack) { ... QuestCmd.CommandText="select top 10 * from mc order by newid()";//以隨機生成10道題為例 QuestConn.Open(); QuestRd=QuestCmd.ExecuteReader(); while(QuestRd.Read()) { Literal LitTxt=new Literal(); Literal LitBl=new Literal(); CheckBoxList ChkMc=new CheckBoxList(); ChkMc.ID="ChkMc"+i.ToString(); LitTxt.Text=i.ToString()+"、 "+Server.HtmlEncode(QuestRd["Question"].ToString())+"<BR><Blockquote>"; LitBl.Text="</Blockquote>"; ChkMc.Font.Size=11; for(int j=1;j<=4;j++) { ChkMc.Items.Add(Server.HtmlEncode(QuestRd["Choice"+j.ToString()].ToString())); ChkMc.Items[j-1].Value=j.ToString(); } mcStr+=QuestRd["Answer"].ToString().Trim(); //mcStr是存儲隨機生成試題答案的字符串變量 MyPanel.Controls.Add(LitTxt); MyPanel.Controls.Add(ChkMc); MyPanel.Controls.Add(LitBl); i++; } ... QuestCmd.CommandText="update StuInfo set Mca='"+mcStr+"' where ExamId= '" +Session["Id"].ToString()+"'"; //將隨機生成試題答案寫入數據表 QuestConn.Open(); QuestRd=QuestCmd.ExecuteReader(); ... } ... } |
四、交卷評分:
當用戶點擊交卷按鈕后,應將用戶的答題結果與試題答案進行比對,并給出相應的分值寫入數據表,最后將表StuInfo中的LogYn字段設置為2,顯示考試得分,代碼如下(test.aspx):
private void ButSend_Click(object sender, System.EventArgs e) { ... for(int i=1;i<=10;i++) //由于隨機生成了10道題,所以循環10次 { for(int j=0;j<4;j++) if(Request.Form["ChkMc"+i.ToString()+":"+j.ToString()]!=null) mcs+="1"; //mcs是存儲考生所選答案的字符串變量,已選用"1"表示,未選用"0"表示 else mcs+="0"; } ... QuestCmd.CommandText="select mca from StuInfo where ExamId= '" +Session["Id"].ToString()+"'"; QuestConn.Open(); SqlDataReader QuestRd=QuestCmd.ExecuteReader(); QuestRd.Read(); int StuScore=0; //存儲得分的變量 for(i=0;i<10;i+=4) { if(QuestRd["mca"].ToString().Substring(i,4).Equals(mcs.Substring(i,4))) StuScore+=2; //從字段mca和mcs中每次取四個字符進行比對,如相等則加上2分 } ... QuestCmd.CommandText="update StuInfo set score="+StuScore.ToString()+",LogYn='2' where ExamId= '" + Session["Id"].ToString()+"'and LogYn='1'"; //設置已評分標志 QuestRd=QuestCmd.ExecuteReader(); ... Response.Redirect("score.aspx"); //顯示考試得分頁面 ... } |
限于篇幅,在此只列出了實現網上考試系統的幾個要點,讀者可根據自已的需要進一步完善相應的數據驗證、后臺管理及界面設計。