熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

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

2013-11-13 10:21:38  來源: .NET編程 

  隨著計算機網絡的普及基於數據庫的B/S網上考試系統得到廣泛地應用現以(C#)+SQL server(或ACCESS)為例說明開發網上考試系統的實現方法
  
  數據庫的設計
  
  建立數據庫netexam在庫中添加考生信息表StuInfo分別建立以下字段考號ExamId(c)(主鍵)考生姓名Name(c)是否登錄考試LogYn(c)得分Score(c)隨機生成的試題答案mca(c) (注:此處以多選題為例單選題判斷題同理)添加多選題題庫表mc建立以下字段題目question(c)四個選choice(c)choice(c)choice(c)choice(c)答案answer(c)(注:多選題答案用表示未選表示選擇如選擇ABD就用表示)
  
  考生登錄
  
  在此處將考生信息插入表StuInfo此處要防止考生重復登錄!給指定唯一的考號並將考號字段ExamId(c)設為主鍵當重復登錄時用Catch捕獲錯誤給出相應提示部分代碼如下(loginaspx)
  
  private void ButOk_Click(object sender SystemEventArgs e)
  {
  
  SqlConnection StuConn=new SqlConnection(Data Source=localhost;Integrated Security=SSPI;
  Initial Catalog=netexam);
  SqlCommand LoginCmd=StuConnCreateCommand(); //可根據不同情況選擇不同的數據庫連接
  
  LoginCmdCommandText=Insert into StuInfo(ExamIdName)  values(+TxtIdTextTrim()++TxtNameTextTrim()+);
  //將考號姓名插入相應字段其中TxtIdTxtName分別是輸入考號和姓名的文本框
  try
  {
  
  Session[Id]=TxtIdTextTrim();
  StuConnOpen();
  LoginCmdExecuteReader();
  ResponseRedirect(testaspx);
  }
  catch(Exception) //捕獲相應錯誤
  {
  ResponseWrite(<script language=\javascript\>+\n);
  ResponseWrite(alert(\不能重復登錄或考號姓名密碼是否有誤!\)+\n</script>);
  }
  
  }
  
  試題生成
  
  防止考生刷新頁面
  
  由於加載試題頁面時將從數據庫中隨機抽取試題所以應防止考生刷新面頁(刷新頁面會重新生成新的試題)方法是將表StuInfo中的LogYn字段默認值設為加載試題後設為交卷評分後設為加載試題頁面時進行相應檢查以防止頁面的刷新代碼如下(testaspx):
  
  private void Page_Load(object sender SystemEventArgs e)
  {
  if(!IsPostBack)
  {
  
  QuestCmdCommandText=select LogYn from StuInfo where ExamId= + Session[Id]ToString()+;
  QuestConnOpen();
  SqlDataReader QuestRd=QuestCmdExecuteReader();
  QuestRdRead();
  if(QuestRd[LogYn]ToString()Trim()Equals()||QuestRd[LogYn]ToString()Trim()Equals())
  //判斷是否已加載試題或是否已評分
  {
  
  ResponseWrite(<script language=\javascript\>+\n);
  ResponseWrite(alert(\不能刷新!請與管理員聯系重新登錄\)+\n</script>);
  
  }
  else
  {
  
  QuestCmdCommandText=update StuInfo set LogYn=; //已成功加載試題
  QuestCmdExecuteReader();
  
  }
  }
  
  }
  
  隨機生成試題
  
  網上考試系統的關鍵是試題的隨機生成即對於不同的計算機訪問系統時將從題庫中隨機地抽取不同的試題
  
  在此我們可使用SQL語句select top n * from mc order by newid()從題庫中隨機抽取n條記錄其中newid()生成 uniqueidentifier 值(若是ACCESS數據庫則用select top n * from mc order by rnd(id)其中id為自動編號字段)
  
  在testaspx頁面上放置一個Panel容器控件以便動態生成綁定到試題的控件並將從表mc中隨機生成的試題答案寫入表StuInfo表中的mca字段代碼如下(testaspx):
  
  private void Page_Load(object sender SystemEventArgs e)
  {
  if(!IsPostBack)
  {
  
  QuestCmdCommandText=select top * from mc order by newid();//以隨機生成道題為例
  QuestConnOpen();
  QuestRd=QuestCmdExecuteReader();
  while(QuestRdRead())
  {
  Literal LitTxt=new Literal();
  Literal LitBl=new Literal();
  CheckBoxList ChkMc=new CheckBoxList();
  ChkMcID=ChkMc+iToString();
  LitTxtText=iToString()+ +ServerHtmlEncode(QuestRd[Question]ToString())+<BR><Blockquote>;
  LitBlText=</Blockquote>;
  ChkMcFontSize=;
  for(int j=;j<=;j++)
  {
  ChkMcItemsAdd(ServerHtmlEncode(QuestRd[Choice+jToString()]ToString()));
  ChkMcItems[j]Value=jToString();
  }
  mcStr+=QuestRd[Answer]ToString()Trim(); //mcStr是存儲隨機生成試題答案的字符串變量
  MyPanelControlsAdd(LitTxt);
  MyPanelControlsAdd(ChkMc);
  MyPanelControlsAdd(LitBl);
  i++;
  }
  
  QuestCmdCommandText=update StuInfo set Mca=+mcStr+ where ExamId= +Session[Id]ToString()+;   //將隨機生成試題答案寫入數據表
  QuestConnOpen();
  QuestRd=QuestCmdExecuteReader();
  
  }
  
  }
  
  交卷評分
  
  當用戶點擊交卷按鈕後應將用戶的答題結果與試題答案進行比對並給出相應的分值寫入數據表最後將表StuInfo中的LogYn字段設置為顯示考試得分代碼如下(testaspx):
  
  private void ButSend_Click(object sender SystemEventArgs e)
  {
  
  for(int i=;i<=;i++) //由於隨機生成了道題所以循環
  {
  for(int j=;j<;j++)
  if(RequestForm[ChkMc+iToString()+:+jToString()]!=null)
  mcs+=; //mcs是存儲考生所選答案的字符串變量已選用表示未選用表示
  else
  mcs+=;
  }
  
  QuestCmdCommandText=select mca from StuInfo where ExamId= +Session[Id]ToString()+;
  QuestConnOpen();
  SqlDataReader QuestRd=QuestCmdExecuteReader();
  QuestRdRead();
  int StuScore=; //存儲得分的變量
  for(i=;i<;i+=)
  {
  if(QuestRd[mca]ToString()Substring(i)Equals(mcsSubstring(i)))
  StuScore+=; //從字段mca和mcs中每次取四個字符進行比對如相等則加上
  }
  
  QuestCmdCommandText=update StuInfo set score=+StuScoreToString()+LogYn= where ExamId= + Session[Id]ToString()+and LogYn=; //設置已評分標志
  QuestRd=QuestCmdExecuteReader();
  
  ResponseRedirect(scoreaspx); //顯示考試得分頁面
  
  }
  
  限於篇幅在此只列出了實現網上考試系統的幾個要點讀者可根據自已的需要進一步完善相應的數據驗證後台管理及界面設計
From:http://tw.wingwit.com/Article/program/net/201311/13372.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.