隨著計算機網絡的普及
基於數據庫的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捕獲錯誤
給出相應提示
部分代碼如下(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>
);
}
}
三試題生成 防止考生刷新頁面
由於加載試題頁面時將從數據庫中隨機抽取試題
所以應防止考生刷新面頁(刷新頁面會重新生成新的試題)
方法是將表StuInfo中的LogYn字段默認值設為
加載試題後設為
交卷評分後設為
加載試題頁面時進行相應檢查
以防止頁面的刷新
代碼如下(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(
)||QuestRd[
LogYn
]
ToString()
Trim()
Equals(
))
//判斷是否已加載試題或是否已評分
{
Response
Write(
<script language=\
javascript\
>
+
\n
);
Response
Write(
alert(\
不能刷新!請與管理員聯系
重新登錄
\
)
+
\n</script>
);
}
else
{
QuestCmd
CommandText=
update StuInfo set LogYn=
; //已成功加載試題
QuestCmd
ExecuteReader();
}
}
}
隨機生成試題
網上考試系統的關鍵是試題的隨機生成
即對於不同的計算機訪問系統時將從題庫中隨機地抽取不同的試題
在此我們可使用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
* from mc order by newid()
;//以隨機生成
道題為例
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=
;
for(int j=
;j<=
;j++)
{
ChkMc
Items
Add(Server
HtmlEncode(QuestRd[
Choice
+j
ToString()]
ToString()));
ChkMc
Items[j
]
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字段設置為
顯示考試得分
代碼如下(test
aspx):
private void ButSend_Click(object sender
System
EventArgs e)
{
for(int i=
;i<=
;i++) //由於隨機生成了
道題
所以循環
次
{
for(int j=
;j<
;j++)
if(Request
Form[
ChkMc
+i
ToString()+
:
+j
ToString()]!=null)
mcs+=
; //mcs是存儲考生所選答案的字符串變量
已選用
表示
未選用
表示
else
mcs+=
;
}
QuestCmd
CommandText=
select mca from StuInfo where ExamId=
+Session[
Id
]
ToString()+
;
QuestConn
Open();
SqlDataReader QuestRd=QuestCmd
ExecuteReader();
QuestRd
Read();
int StuScore=
; //存儲得分的變量
for(i=
;i<
;i+=
)
{
if(QuestRd[
mca
]
ToString()
Substring(i
)
Equals(mcs
Substring(i
)))
StuScore+=
; //從字段mca和mcs中每次取四個字符進行比對
如相等則加上
分
}
QuestCmd
CommandText=
update StuInfo set score=
+StuScore
ToString()+
LogYn=
where ExamId=
+ Session[
Id
]
ToString()+
and LogYn=
; //設置已評分標志
QuestRd=QuestCmd
ExecuteReader();
Response
Redirect(
score
aspx
); //顯示考試得分頁面
}
限於篇幅
在此只列出了實現網上考試系統的幾個要點
讀者可根據自已的需要進一步完善相應的數據驗證
後台管理及界面設計
From:http://tw.wingwit.com/Article/program/net/201311/13372.html