top
Loading...
用ASP開發試題庫與在線考試系統

摘 要 利用網絡和數據庫技術,結合目前硬件價格普遍下跌與寬帶網大力建設的有利優勢,我們基于B/S模式研究開發了試題庫與在線考試系統這一ASP應用程序。它運用方便、操作簡單,效率很高,現階段雖只實現了試卷的客觀題部分,但已具有試題(卷)錄入、修改和查詢,手工組卷與自動組卷以及進行在線考試等重要功能,也就是說實現了真正的無紙化考試,滿足任何授權的考生隨時隨地考試并迅速獲得成績,并給出其詳細的成績分析與試卷評估,同時也大大減輕了教師出題、組卷和改卷等繁重的工作量。

引 言

現階段,學校與社會上的各種考試大都采用傳統的考試方式,在此方式下,組織一次考試至少要經過五個步驟,即人工出卷、考生考試、人工閱卷、成績評估和試卷分析。顯然,隨著考試類型的不斷增加及考試要求的不斷提高,教師的工作量將會越來越大,并且其工作將是一件十分煩瑣和非常容易出錯的事情,可以說傳統的考試方式已經不能適應現代考試的需要。隨著計算機應用的迅猛發展,網絡應用不斷擴大,如遠程教育和虛擬大學的出現等等,且這些應用正逐步深入到千家萬戶。人們迫切要求利用這些技術來進行在線考試,以減輕教師的工作負擔及提高工作效率,與此同時也提高了考試的質量,從而使考試更趨于公證!客觀!更加激發學生的學習興趣。例如目前許多國際著名的計算機公司所舉辦的各種認證考試絕大部分采用這種方式。為了適應新形勢的發展,我們推出了這一系統,使其盡快在各類考試中發揮高效、便捷的作用,把老師從繁重的工作中解脫出來!

一、基本簡介

試題庫與在線考試系統采用ASP、HTML、Frontpage2000/98、Javascript、VBScript、Java編程語言、圖形編輯與數據庫等工具,通過基于WEB服務器訪問純WEB頁面,實現在線組卷與考試等各項相關的功能。

它是專門用于試題(卷)錄入、查詢、修改、刪除、組卷和參加在線考試的ASP應用程序。其最大的特點是開放性、方便性和靈活性。主要是指一般的用戶不僅可以輕松地向題庫添加、修改和查詢試題(卷),而且還可以自動新增科目并建立相應的數據表;它還允許用戶根據自己的需求,從現有的試題庫中靈活地抽取各類試題,以組建適合于自身所需的試卷。而且,自測試卷的難易程度和形式以及各大題分數等都由用戶根據需要確定。考生通過瀏覽器進行有效的身份驗證登錄后,輸入正確的試卷編號,并要求在規定的時間內進行答題,當達到規定的時間后,系統將自動予以提交。一旦考生做完后便能立即看到預先記錄在庫中的標準答案和自己的平時成績(正規考試試卷不得隨意更改以及答案將不及時提供),并且其答案和分數將被記入庫中以供審核和查閱,并作為成績評估和試卷分析的歷史數據;另外,還可完全由計算機自動按照"難度系數"靈活、隨機的抽取試題庫中的各類試題組成各種形式的試卷,其內容會隨著庫中試題的改變而改變,不妨把它稱之為實時的互動的試卷。

用戶對象主要是大、中、小學及職業學校等單位的教師及學生和企事業單位的教育部門(因企事業單位每年要對員工進行素質、安全教育與技能等方面的培訓及考試等)。

二、運行環境與系統結構

此應用程序可廣泛運行于國際互聯網即Internet,也可適用于內部的局域網。其運行要求和邏輯結構分別如下:

客戶端:Windows95/98,Internet Explorer(IE)等

服務器端:Windows NT/Windows2000,Internet Information Server (IIS)4.0及其以上版本,IE等;或者Windows98,Personal Web Server(PWS),IE等。

數據庫:采用SQL Server,運行于服務器端。


試題庫與在線考試系統邏輯結構圖

三、系統特點

系統聯為一體,界面整齊、美觀,操作簡單、方便。另外,支持按權限對系統進行操作,即不同類型的用戶擁有相異的權限對題庫執行不同的操作。主要是在首頁通過兩種不同的方式進入相異的操作界面,以確保整個數據庫中數據的安全性及完整性。其主要特點體現在以下三個方面:

(1) 自主設計數據庫 ⑵ 自主調用數據庫 ⑶ 自主管理數據庫

自主設計數據庫是指用戶能夠根據自己的需要創建新科目數據庫(即系統實現了自動建表的功能),讓數據庫真正成為用戶自己的數據庫。不過,只要庫中已存在該科目名稱及表名,則不予重建,這樣就保證了數據的統一性;自主調用數據庫即允許用戶能自由地從數據庫中抽取試題組成試卷,試卷中有幾道大題和小題以及是否提供查看答案均由用戶自行設置并選題。通常來說,一份高質量的試卷,需要用戶反復推敲、比較和琢磨,用戶就象進超市買東西一樣能方便地把看中的取出來,也可反悔把不需要的退回去,并且在形成一份完整的試卷之前,允許任意調整該試題的次序。在組卷時,還可以多份試卷選取同一試題或同一知識點的試題,但嚴禁一套試卷中出現知識點相同(似)且難度一致的試題。不過,其最大的缺陷在于目前只實現了試卷中的客觀題部分,即包括判斷、單選和多選題。而且,還沒有實現客觀題部分和真正的多媒體試卷;自主管理數據庫指一般用戶具有添加、修改和檢索數據的權力,實現數據庫的可擴充性和開放性。而管理員則另具有刪除數據的權力,從而達到了系統數據統一性和一致性的目的,具體情況請見系統演示。

四、詳細設計

4.1、試題(客觀題部分)設計

在以往的考試中,判斷題常常是通過畫" ╳ "," "來判斷;而單選題往往在四個供選的答案A、B、C、D中選擇唯一正確的答案;另外,多選題跟單選題在根本上沒什么區別,只是供選的答案和標準答案多一些。因而,本系統中所涉及的單選題和多選題跟過去的大體相同,主要不同在于把判斷題巧妙地轉化為只有兩個選項的單選題,并且假設多選題一般情況下也是最多提供六個備選答案,標準答案至少有一個。故各題型的樣題設計如下:

判斷題-->如:重發器也叫中繼器: (A)錯 (B)對
單選題-->如:HUB是指: (A)網橋 (B)集線器 (C)網關 (D)路由器
多選題-->如; Internet上使用的網絡協議是: (A)IPX/SPX兼容協議 (B)TCP/IP協議 (C)NetBEUI協議 (D)X.25協議 (E)ATM LAN仿真用戶 (F)快速紅外線協議

4.2、數據庫設計

4.2.1、試題結構

通常,每一類型的試題都應有一個表結構。但考慮到目前系統存貯空間已經不受物理空間的限制。因此,我們采用按科目而不按試題類型方案來建立數據表,更不把所有科目的全部試題集中在一起,只是每道客觀題均有六個備選答案項,還有一個表用來記錄各科目數據表的相關屬性。這樣,查詢起來較方便,可能會節約時間,也不致于造成數據十分雜亂等。詳細設計如下表所示:

說明:
1. 按科目(一般以1個學期為標準)分別定義各表,表名一律由中文名漢字拼音首字母構成。例如,軟件工程---RJGC;計算機網絡---JSJWL;小學二年級上期數學---XXENJSQSX

2.字段名是指該字段的中文名

3.字符標識一般由中文名拼音首字母構成,外鍵字段最好與主表對應字段同名

4.若該字段為字符型,則對應的長度欄填最大允許長度,若為固定長度則加'定'字

5.若該字段可以為空,則對應的NULL欄填Y,否則不填

6.若該字段為主鍵,則對應的主鍵欄填Y,否則不填

科目數據信息表

字段名字符標識類型長度NULL 主鍵 說明
科目中文詳細名稱KMMCCHAR50   以中文為準,例如"計算機網絡"
科目表名KMBMCHAR 50 Y  一律由上面中文名拼音首字母構成,如"JSJWL"
錄 入 者LRZ CHAR 15   默認為錄入員登入帳號
錄入日期LR_DATEDATE10   默認為錄入時的系統日期
備 注MEMO CHAR 50 Y   

4.2.2、試卷結構

試卷一般包括客觀題(判斷題、單選題或多選題)和主觀題(填空題、短文字題或長文字題),即一套試卷包括若干大題,每道大題包含若干小題。但是,本系統的試卷目前只涉及客觀題部分。故大題數暫定為最多3道,小題數總和若干,而且,在此表中只存貯該科目試卷相應的試題編號,其試題內容則在調用時到相應科目中查詢獲得。

4.2.3、用戶、留言信息結構

A、超級用戶:在此系統中有且僅有一個,即系統管理員。他具有一般用戶所沒有的至高無上的權力,即具有刪除用戶、留言、試題以及試卷等信息的權力。它不需注冊,在數據庫沒有它的任何相關信息,但可由管理員自己更改用戶名和密碼。確保萬一數據泄密而造成系統的危害。

B、一般用戶:主要是指學校的教師及學生和企事業單位的教育部門等。另外,所有用戶可能會對我們的系統發表意見或相互之間答疑。

4.2.4、考生答案成績表結構
實際考試日期可能因某種原因推遲考試而與試卷表中的考試日期有所不同。因而,此表應與用戶、試卷及試題庫等多表相關聯,關系比較復雜。

4.3、功能模塊詳細設計

下面,按照錄入試題-出卷-進行考試等流程就各個模塊分別進行詳細討論,具體情況見系統源程序及演示。考慮到數據的保密與安全問題,凡進入系統的用戶,必須先注冊,然后通過驗證才能進入。否則,進入"SORRY"頁面。

4.3.1、錄入模塊

許可的用戶根據自身教學目的和要求,可以向庫中添加各種類型且符合要求(對不符合的將給出提示和警告,并且不予保存!)的試題和試卷以及各自的意見與疑難問題等。一旦添加成功,只有管理員才能刪除。

①試題錄入

首先,用戶選擇試題所屬科目。若下拉菜單中沒有該科目,則點擊右邊的新增科目,即進入這一頁面,只要輸入新增科目詳細名稱(一般以一個學期修完為標準)和表名(最好由漢語拼音首字母組成),即可由系統根據已設定好的字段自動建立新的科目試題表。返回、刷新一次頁面,即可看到新增的科目名稱。而且,在本系統中其它需要選擇科目的地方也會自動更新。

其次,每道試題有類型、難度系數、選自書籍及章節、試題內容與答案和標準答案等欄目。用戶一一輸入完(對于該試題不需要的答案項,則默認為"不填"),按"提交"后,即可看到預覽效果。如果輸入不合法,或者該科題庫中已有該試題編號和內容等,則系統給出相應的提示或警告,以待更正。

②試卷錄入

此子模塊包括兩個部分,即標識試卷的基本信息錄入和手工組卷部分。其基本信息有試卷編號、標題、套數、難度、科目名稱、考試性質與日期等,而卷中試題將通過后面的手工組卷模塊予以實現。對于用戶輸入的不符合系統要求的數據,系統仍舊給出提示或警告。

③用戶留言

凡使用此系統的用戶可能對我們的工作有許多良好的建議和意見,或者有一些疑難問題需要大家共同探討的話,可以在此提出。

4.3.2、查詢模塊

系統中的所有用戶均可檢索試題、試卷、用戶及留言等信息。只是試題檢索界面較復雜,但它已實現了多種條件的組合查詢,非常適合于數量繁大的試題庫。而后三者相對來說比較簡單,"默認"或"空白"的情況下,則按該表中的系統默認的字段顯示其全部信息。使用起來比較靈活、方便。

4.3.3、修改模塊

用戶除了只修改自己的部分資料(包括用戶帳號、密碼和E-Mail)外,還可修改試題及試卷,而留言則不許修改。只要用戶選擇科目和輸入編號,即可進行修改。不過,對于各表中的主鍵不準修改,避免了造成系統中的數據混亂,或者覆蓋其它有用數據的現象。如果用戶執行了非法操作,則必須重新操作。

4.3.4、組卷模塊

在組卷過程中,我們肯定會遇到有許多題目是關于同一個教學內容的,這里稱之為關于同一考核點的試題。因此,在組裝一份試卷時,對于同一考核點的試題只能出一道題。這里設計一種快速選題算法,該算法只需經一次比較,便可判定是否已選過該考核點的試題,且又可以有針對性地重點選取某個考核點的試題。即每一道題都設有一個相關碼,對于同一章、同一節、同一考核點的題,則相關碼相同,顯然,前面章節的相關碼都要小于后面章節的相關碼。故在組卷時,同一試卷中不允許出現相關碼相同的試題。所以,在選題過程中每選出一題,就要與已經選出的題的相關碼逐一進行比較,若該題的相關碼與已選各題的相關碼均不相同,則可將該題加入到試卷中,否則,放棄該題,重新進行選題。

下面,在只考慮最佳情況下,即每次選出的題都恰好是尚未選過的,每選一道題就要與已選出的各題逐一比較,假設已選出了M題,再選下一題時,則需比較M次,不妨設一份試卷的總題數為N,在最佳情況下,則總的比較次數為:

0,1, 2,…N-2,N-1

即時間復雜度為O(N),這樣,就可保證下面算法中選擇出來的試題編號都合法。

基本算法:

{定義參數,獲得整套試卷的共同限制參數,即包括輸入必要條件得到必要參數和 輸入任選條件得到任選參數}

必要參數組合= A1 AND A2 ''AND An;任選參數組合= B1 OR B2 ''OR Bn;
大題數dts =3 '默認為3道大題;小題數xts=0 '默認為50道小題;
IF 無判斷題 THEN dts=dts - 1 END IF '開始計算大題數
IF 無單選題 THEN dts=dts - 1 END IF
IF 無多選題 THEN dts=dts - 1 END IF

開始掃描相應科目的試題庫,獲得臨時所有符合條件的試題預覽,接著開始手工細選試題以生成試卷或計算機自動組卷。

IF 符合必要參數組合 THEN
SELCECT 任選參數
B1:顯示符合必要參數+B1的試題編號及內容
B2:顯示符合必要參數+B2的試題編號及內容
┋ ┋ ┋
Bn:顯示符合必要參數+Bn的試題編號及內容
END SELCECT
END IF
IF dts>= 1 THEN
IF 試題編號合法THEN xts=xts + 1
ELSE 請輸入合法的試題編號!
END IF
IF dts>xts THEN xts必須大于或等于dts!
ELSE
IF 某已存在的題型中小題數為0 THEN 該題型至少要有1道試題!
END IF
END IF
IF 判斷題存在且分數<= 0 OR分數>100 THEN 請修改!
ELSE TOTALFEN= TOTALFEN +PDTF
END IF
IF 單選題存在且分數<= 0 OR分數>100 THEN 請修改!
ELSE TOTALFEN= TOTALFEN +DXTF
END IF
IF 多選題存在且分數<= 0 OR分數>100 THEN 請修改!
ELSE TOTALFEN= TOTALFEN +TSTF
END IF
IF TOTALFEN <= 0 OR TOTALFEN > 100 THEN
總分在1---100分之內!
END IF
ELSE 試卷大題數不得為0!
IF testtime<= 0 OR testtime>= 4 (hour) THEN
考試時間必須滿足0 <testtime< 4 (hour)!
END IF
END IF
IF所有數據均合法 THEN 則將該試卷的相關信息存盤
END IF

主要有下面兩個子模塊:

其一:手工組卷模塊

用戶提交相關限制條件,由系統根據這些條件先從大的范圍內調出試題,稍后再手工通過復選按鈕細選以生成自己所需的試卷,即利用現有的試題庫,可編制出多份試卷。在組卷時,可以對所選的每一試題進行增刪,順序進行調整,并可自行規定各大(小)題分數和試卷的考試時間(默認值前已述及)。總之,能作出用戶完全滿意的試卷,以供在線考試或測試使用。

其好處關鍵在于---選題隨機性強、成卷速度較快、試卷質量高;知識考核點分布均勻,且內容覆蓋面容易控制。例如,期中考試時,只考前一半內容時,只要選取章節碼小于或等于某個指定的值,則一定不會出現后一半內容的試題。

其二:計算機自動卷模塊

完全由系統自動按照"易-中-難"順序和根據用戶選擇的信息,靈活、隨機的抽取試題庫中的各類試題組成試卷,試卷內容會隨著庫中試題的改變而改變,試卷庫中沒有保存試卷的基本信息及相應的試題編號,不妨稱之為活動的互動的試卷。不過,其試卷質量不高,難易程度把握不當,知識考核點分布不均,一般只作在線練習使用。

4.3.4、進入在線考場模塊

進入在線考場是本系統非常重要的部分之一。因為一個系統如果涉及到現實的話,就必須考慮得十分周到、完善。考生登錄后,只要輸入已編輯好的試卷編號,就可以調出其試卷進行在線考試或測試,其答題信息通過單、復選按鈕選擇答案來反映。為了防止考生多次提交試卷和規范考場紀律,采取自愿交卷和到了規定的時間自動收卷兩者有機結合的方式、限制考試時間和期限以及禁用鼠標等辦法予以實現。但真正的無人監視的考試好象不能用軟件實現,而且其安全性在系統設計中也很重要。因此,在設計過程中注意了以下幾個問題:

1、只有考生自己才能參加考試!2、考試時間到了將自動交卷!

3、限制提交次數,暫只提供一次機會!4、禁止用戶聯網作弊!

上圖為此模塊程序設計詳細流程圖

4.3.5、在線練習模塊

計算機自動組卷模塊組成的互動的試卷(卷庫中沒有保存此類試卷的任何信息!)是通過單復選按鈕來反映用戶的做題信息。它主要用于平時的在線練習等,讓用戶了解自身的不足,并有針對性地進行復習和訓練。因此,用戶做完后,只要點擊"查看答案",就可以與相應試題的標準答案對比,以便及時反饋情況,而沒有提供成績判定與分析和時間限制等。

4.3.6、成績分析與試卷評估模塊

考生每參加一次考試,系統根據已有的標準答案很快得出其分數,再根據不同的分數段給出相異的評語。一方面與其它同科考生進行橫向對比,得出各個考生之間的差別;另一方面,也通過用戶一段時期內參加同科考試的成績來做縱向比較,用以說明其掌握該科目內容的實際程度,以便做出相應的決定。另外,管理員先給出一套完整試卷的預先評估,然后由系統自動根據同一試卷編號的所有用戶成績給出其實際的評估,并且都有一個難度等級,把兩次評估進行比較得出該卷的難易程度以及更詳細的評估情況。

4.3.7、刪除模塊

在整個系統中,只有系統管理員具有此權限。管理員通過復選按鈕選擇要刪除的用戶、留言、試卷及科目,而對于數量較大的試題庫則通過輸入或選擇條件,就可達到刪除那些過時的無用的試題,當然,對于那些惡意破壞系統的用戶,管理員有權刪除他,以示懲罰。這樣就可確保數據庫不至于十分龐大和其安全性。

五、ADO--ActiveX Data Object操作數據庫的幾個步驟

第一步數據庫數據來源設定。若要訪問數據庫,需在"控制面板"中的"ODBC Data Sources",建立數據庫名稱(選擇Users DSN),點擊"Add"按鈕,選定數據庫所用的驅動程序和文件等。

第二步使用"Server.CreateObject"建立連接的對象,并使用"Open"打開待訪問的數據庫。set adocon=Server.CreateObject("ADODB.Connection");adocon.Open "zxtest"

第三步設定SQL命令,使用"Execute"命令,即可開始執行訪問數據庫的動作。

sqlstr ="select * from jsjwl where stbh like 'PD' order by stbh ASC"
set rs = adocon.Execute(sqlstr) ′adocon為第二步所設定的對象名稱

第四步使用Recordset對象的命令,顯示結果,其中rs為第三步所定義。

rs.fields.count:記錄的字段數;
rs(i).name:第i(指針)個字段名,i由0算起到rs.fields.count-1;
rs(i):讀取第i(指針)個字段的記錄,i由0算起到rs.fields.count-1;
rs("字段名"):讀取指定的字段的記錄;rs.eof:是否已指定最末條;
rs.movenext:將指針移到下一條;rs.moveprev:將指針移到上一條;
rs.movefirst:將指針移到第一條;rs.movelast:將指針移到最末條;

第五步使用后關閉數據庫:

rs.close;adocon.close

六、數據的安全與保密

由于此系統的特殊性,數據的安全與保密顯得尤為重要。保密性是指用戶在網上的所有信息應有一定的保密度,不同類型的用戶之間的內容是互相保密的。安全性是指用戶參加一次活動是一個安全的過程,對于所有用戶的動作,服務器都加以跟蹤。為了確保其安全與保密性,一要確保考生不能聯網作弊;二要在試卷上實時加以監控;三要在時間上加以嚴格的控制等。主要通過下列兩種途徑予以實現:

其一,凡進入在線考試的用戶,都要通過用戶身份驗證(見下圖)才能進入。而且,不同用戶具有不同的操作權限,支持按權限進行操作,確保數據的公共性與私有性。不允許用戶執行非法的操作,防止用戶無意或有意的破壞。

其二,禁止用戶查看所有試卷的源文件及拷貝功能,方法有二:

1、禁止使用鼠標右鍵等功能;

II、試卷庫中的試卷將以無下拉菜單及工具欄等的頁面方式呈現在瀏覽者面前。

七、附錄:源程序列表

由于源代碼繁多,限于篇幅,無法一一列舉,現只公布部分代碼,具體以系統實物為準。下面是錄入試題.asp文件:

<script language="VBScript">
<!-- 'Written by HeKai 2001
Function datacheck()'確保前臺輸入數據合法
dim errflag, msg
errflag = True
if Len(Trim(luru.xzsj.value)) = 0 Then
focusto(1); errflag = false; msg="請輸入 '選自書籍名稱'"
ElseIf Len(Trim(luru.stnr.value)) = 0 Then
focusto(9); errflag = false; msg=" '試題內容' 呢"
ElseIf Len(Trim(luru.A.value)) = 0 Then
focusto(10); errflag = false; msg=" '答案_A' 呢"
┋ ┋ ┋
ElseIf Len(Trim(luru.F.value)) = 0 Then
focusto(15); errflag = false; msg="請還原成默認值"
End if
If (errflag = false) then
msg = msg & vbCRLF
MsgBox msg, 64, "提示"
Exit Function
End if
datacheck = errflag; luru.Submit
End Function

Sub focusto(x)'將鼠標定位在出錯處
document.luru.elements(x).focus()
End Sub
--></script>

以下是錄入試題.inc文件:

<script Language="VBScript" RunAt="Server">
Function check_Pass()'檢查庫中是否已有此數據
kmxxmc = Request.Form("kmxxmc")
stbh = Request.Form("stbh") stnr = Request.Form("stnr")
SQLstr = "select * from " & kmxxmc & " where stbh=" & "'" & stbh & "'"
SQLstr = SQLstr & " or tmnr=" & "'" & stnr & "'"
set adocon=Server.CreateObject("ADODB.Connection")
adocon.Open "zxtest"
set sa1=adocon.Execute(SQLstr)
If sa1.EOF Then
check_Pass = False
Else
check_Pass = True
End If
sa1.Close adocon.Close
End Function

Sub Add_Comment()'開始插入數據并顯示出來
Dim kmxxmc,xzsj,tmlx,nycd,jxyq,stbh,stnr
Dim A,B,C,D,E,F,bzda,lrz,Picstr,SQLstr,lr_date,zhang,jie
kmxxmc = Request.Form("kmxxmc") xzsj = Request.Form("xzsj")
┋ ┋ ┋
bzda = Request.Form("bzda") zhang = Request.form("zhang")
set adocon=Server.CreateObject("ADODB.Connection")
adocon.Open "zxtest"
SQLstr = "insert into " & kmxxmc & " (xzsj,tmlx,tmnd,jxyq,stbh,tmnr, bxda_a,"
SQLstr = SQLstr & ",jie,lrz) values (" & "'" & xzsj & "'," & "'" & tmlx & "',"
┋ ┋ ┋
SQLstr = SQLstr & "'," & "'" & date & "'," & "'" & zhang & "'," & "'" & jie & "'," SQLstr = SQLstr & "'" & lrz & "')"
set sa1 = adocon.Execute(SQLstr)
Picstr="<img src='/images/hekai.jpg'>"
Response.Write "恭喜!此為<i> " & lrz & "</i> 剛才錄入的試題"
Response.Write Picstr & " 試題編號:" & stbh
Response.Write "試題內容:" & stnr & "<br>"
Response.Write "答案_A:" & A & "<br>"
┋ ┋ ┋
adocon.Close
End Sub

Sub Register()
If check_Pass() Then '如果庫中已有的話,則給出提示信息
Show_Warning()
Else '否則添加進去
Add_Comment()
End If
End Sub

Sub Show_Warning()'給出提示信息的函數
Response.Write("<p>")
Response.Write("<center>很抱歉<p>")
Response.Write("庫中已有此試題編號或試題內容,請返回前頁修改!")
Response.Write("</center>")
Response.Write("Made by hekai himself in 2001")
End Sub
</script>

此為"檢索試題"的程序代碼:
<script Language="VBScript" RunAt="Server">
Function adjust_sql(adj_str)
'目的---轉換查詢字符串中的特殊字符至SQL指令
Dim final_str, i 'WRITE BY HEKAI2001
adj_str = Trim(adj_str)
final_str = "" '每次從傳進來的字符串中取出一個字符,并判斷是否為下述三個字符之一: DOS的Filter符號"|"、左中括號"["以及單引號"'"
If Len(adj_str) > 0 Then
For i = 1 To Len(adj_str)
Select Case Mid(adj_str, i, 1)
Case "[": final_str = final_str & "[[]"
Case "|": final_str = final_str & "[{-}]"
Case "'": final_str = final_str & "[&-()"
Case Else: '以上皆非則什么事都不做!
final_str = final_str & Mid(adj_str, i, 1)
End Select
Next
End If
adjust_sql = final_str
End Function

Sub Output_shiti()
Dim kmxxmc,xzsj,stbh,zhang,jie,tmlx,nycd,jxyq,lrz,stnr,cond_count, Picstr
Dim SQLstr,mf,zhangfw,jiefw,stbhfw,nycdfw,lr_datefw,lr_date
'記錄指定條件的欄位總數
cond_count = 10; mf = "%"
Picstr="<img src='/images/hk.gif'>"
'取得表單欄位內容
kmxxmc = Request.Form("kmxxmc")
stbh = Request.Form("stbh")
┋ ┋ ┋
stnr = Request.Form("stnr")
'調整SQL指令中的特定字元
kmxxmc = adjust_sql(kmxxmc)
stbh = adjust_sql(stbh)
┋ ┋ ┋
stnr = adjust_sql(stnr)
If Len(xzsj) = 0 Then cond_count = cond_count - 1
If Len(stbh) = 0 Then cond_count = cond_count - 1
┋ ┋ ┋
If Len(stnr) = 0 Then cond_count = cond_count - 1
SQLstr = "select * from " & kmxxmc & " where "
If Len(stbh) > 0 Then
SQLstr = SQLstr & " stbh " & stbhfw & "'" & stbh & "'"
If cond_count > 1 Then
SQLstr = SQLstr & " and "
cond_count = cond_count - 1
End If
End If
┋ ┋ ┋
If Len(stnr) > 0 Then
SQLstr = SQLstr & " tmnr like " & "'" & mf & stnr & mf & "'"
If cond_count > 1 Then
SQLstr = SQLstr & " and "
cond_count = cond_count - 1
End If
End If
SQLstr = SQLstr & " order by lr_date DESC "
set adocon=Server.CreateObject("ADODB.Connection")
adocon.Open "zxtest"
set sa1 = adocon.Execute(SQLstr)
If sa1.EOF Then
Response.Write "<br><center><h1>"
Response.Write "Sorry!<p>"
Response.Write "沒有找到試題,"
esponse.Write "請重試一次!</center><p>"
Response.Write "<hr></h1>"
Else
i = 0
Response.Write "<h2>"
Response.Write "符合條件的試題相關內容如下:"
Response.Write "</h2>"
While Not sa1.EOF
i = i + 1
Response.Write "第 <i>" & i & "</i>題 題編號:<i>" & sa1("stbh") & "</i><br>"
Response.Write "試題內容:" & sa1("tmnr") & "<br>"
┋ ┋ ┋
Response.Write "答案A:" & sa1("bxda_a") & "<br>"
sa1.MoveNext
WEnd
adocon.Close
End If
End Sub
</script>

<% '"檢索試卷"的查詢方式源代碼
mf="%"
select case request("findfs")
case "sjbh"
sqlstr="SELECT * FROM tbsjxx WHERE " & " sjbh LIKE"
sqlstr=sqlstr & "'" & mf & request("findfsz") & mf & "'order by ksrq DESC"
┋ ┋ ┋
case "lr_date"
sqlstr="SELECT * FROM tbsjxx WHERE " & " lr_date LIKE"
sqlstr=sqlstr & "'" & mf & request("findfsz") & mf & "'order by ksrq DESC"
case else
sqlstr="SELECT * FROM tbsjxx order by ksrq DESC"
end select %>

下面是考試的時間自動控制程序(便于演示只設了60秒鐘,實際應用應以系統調出試卷的考試時間為準!):

<SCRIPT language=JavaScript>
<!-- Write by HEKAI for TestTimeContorl
var timerID = null;var timerRunning = false
var stardate = new Date();var startime = gettotalsecond(stardate)
var totaltime = 60; var lasttime;var facetime
function Stepclock(){
// hk made by himself
if(timerRunning)
clearTimeout(timerID)
timerRunning = false }
function startclock(){
Stepclock();showtime() }
function gettotalsecond(getdate){
var hours = getdate.getHours()
var minutes = getdate.getMinutes();var seconds = getdate.getSeconds()
var gettotalsecond = seconds + minutes * 60 + hours * 3600
return(gettotalsecond) }
function showtime(){
var now = new Date();var timeValue = gettotalsecond(now)
document.clock.face.value = timeValue - startime
facetime = document.clock.face.value;lasttime = totaltime - facetime
document.clock.sytime.value = lasttime
timerID = setTimeout("showtime()",1000)
timerRunning = true
if (lasttime == 20){
for(i=1;i<=3;i++){
alert('考試時間只剩下最后20秒!')}}
if (lasttime == 0){
for(i=1;i<=5;i++){
alert('時間完畢!請迅速交卷!!')}}
if (lasttime == -10){
for(i=1;i<=10;i++){
alert('考試時間超過10秒,關閉此窗口!')}}
}//-->
</SCRIPT>

八、后記

此系統從研究設計到投入實際應用歷時4個月之余,通過多次細致的測試及鑒定,證明系統完全具有可行性與可擴充性,就最近傳來的消息,該系統獲得了湖南省科技廳的普遍好評。另外,系統還有待于進一步升級,并將實現試卷的主觀題部分和多媒體試卷。因此,仍有大量的工作需要開展。若有不詳或不妥之處,請您以應用程序為準以及提出良好的意見與建議。


作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗