利用ASP.NET構建網上考試系統

來源:互聯網
上載者:User
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):

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\">"+"\n");
  Response.Write("alert(\"不能重複登入,或考號、姓名、密碼是否有誤!\")"+"\n</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\">"+"\n");
   Response.Write("alert(\"不能重新整理!請與管理員聯絡,重新登入。\")"+"\n</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"); //顯示考試得分頁面
 ...
}
  限於篇幅,在此只列出了實現網上考試系統的幾個要點,讀者可根據自已的需要進一步完善相應的資料驗證、後台管理及介面設計。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.