摘要:運(yùn)用Visual Basic.NET與Microsoft Acess數(shù)據(jù)庫(kù)及VBA技術(shù),實(shí)現(xiàn)通用試題庫(kù)管理和基于Word的試卷文檔的輸出。闡述了系統(tǒng)的原理及功能結(jié)構(gòu),并對(duì)開(kāi)發(fā)過(guò)程中的一些關(guān)鍵技術(shù)及其實(shí)現(xiàn)方法進(jìn)行了描述。
關(guān)鍵詞:Visual Basic.NET;數(shù)據(jù)庫(kù);通用題庫(kù)管理
中圖分類號(hào):TP311.52 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2009)05-1035-03
General Test Database Management System Development
PAN Ying-hui
(Department of Electronic Engineering Wuyi Institute,Wuyishan 354300,China)
Abstract: Using Visual Basic.NET and Microsoft Acess Database and the VBA technology, realize general test database management and the Word examination paper documents output。Elaborated system's principle and the function structure, describe a number of key technologies and their implementation in the development process.
Key words:Visual Basic.NET; Database; General Test Database Management
1 引言
考試是教學(xué)過(guò)程中必不可少的重要環(huán)節(jié),是檢查教學(xué)成果的必要手段之一。開(kāi)發(fā)通用題庫(kù)管理系統(tǒng),從題庫(kù)中抽取試題,自動(dòng)生成試卷,有利于按事先指定要求的內(nèi)容范圍、目標(biāo)層次及難度系數(shù)進(jìn)行考核,能有效地避免人工組卷中命題和評(píng)分標(biāo)準(zhǔn)的主觀隨意性,使考試具有評(píng)估功能,有利于試題庫(kù)管理的自動(dòng)化和標(biāo)準(zhǔn)化,可以幫助教師從繁重的手工出題、組卷考試的勞動(dòng)中解脫出來(lái);同時(shí)對(duì)樹(shù)立良好的學(xué)風(fēng),建立規(guī)范的教學(xué)質(zhì)量監(jiān)控系統(tǒng)都是行之有效的。
目前較成熟的題庫(kù)管理系統(tǒng)一般是文字形式,也有部分支持圖文形式,但由于只支持圖片格式,試題中的圖文、公式、表格混排等內(nèi)容,只能以圖片格式存于題庫(kù)中,若要修改其內(nèi)容,便無(wú)法在原題基礎(chǔ)上進(jìn)行編輯修改,使得目前開(kāi)發(fā)的試題庫(kù)管理系統(tǒng)在圖文、公式混排編輯,自動(dòng)組卷、自動(dòng)排版等方面還存在一定的缺陷和設(shè)計(jì)難點(diǎn)。因此,開(kāi)發(fā)一通用試題庫(kù)管理系統(tǒng),采用統(tǒng)一手段解決各學(xué)科、專業(yè)對(duì)題庫(kù)的特殊要求,可以提高管理系統(tǒng)的通用性、擴(kuò)展性、易用性。
2 系統(tǒng)設(shè)計(jì)思想
通用試題庫(kù)所涉及的數(shù)據(jù)庫(kù),不僅有文字,還有大量的圖形、公式、表格以及有關(guān)工程特殊符號(hào),而組成的圖形又具有大量圖素的屬性數(shù)據(jù)信息。因此系統(tǒng)要具備文字、圖形、公式、表格等的處理能力,這種處理能力必須是通用的,開(kāi)放融合的。Microsoft Word是最流行的文字處理軟件,能夠使用各種特殊符號(hào),插人各種對(duì)象,能夠?qū)崿F(xiàn)試題的圖文、表格、公式等的編輯與管理以及共享不同應(yīng)用程序信息資源。題庫(kù)的設(shè)計(jì)思想是,若試題內(nèi)容僅為文字,則直接存于數(shù)據(jù)庫(kù)中,若試題內(nèi)容還有圖文、表格、公式等其它信息,則以Word文檔為載體,存于數(shù)據(jù)庫(kù)中。對(duì)于試題中含有圖片、表格或公式等錄人,可以在Word軟件下插人各種對(duì)象,或者復(fù)制對(duì)象進(jìn)行編輯錄人,不需做任何轉(zhuǎn)換或處理,這樣用戶可以根據(jù)需要對(duì)試題庫(kù)中的試題,進(jìn)行編輯、修改,使系統(tǒng)具有良好的擴(kuò)充性,以適應(yīng)各種學(xué)科和課程所建立試題庫(kù)的需要。對(duì)于公式、CAD圖形、Protel電路圖形或GIS等專業(yè)圖形,由于是采用不同的專業(yè)軟件制作而成的,為了便于以后對(duì)試題進(jìn)行修改,不應(yīng)轉(zhuǎn)化成簡(jiǎn)單的位圖 ,應(yīng)在題庫(kù)錄入時(shí)保持源格式入庫(kù)。
Visual Basic.NET (以下簡(jiǎn)稱VB.NET)是Microsoft公司研發(fā)的可視化、面向?qū)ο蠛筒捎檬录?qū)動(dòng)方式的結(jié)構(gòu)化高級(jí)程序設(shè)計(jì)語(yǔ)言,可用于開(kāi)發(fā)Windows環(huán)境下的各類應(yīng)用程序,界面友好、簡(jiǎn)單易用、功能強(qiáng)大,是十分流行的開(kāi)發(fā)工具,它采用代碼編輯、編譯、連接、調(diào)試功能為一體的集成開(kāi)發(fā)環(huán)境(IDE)。數(shù)據(jù)庫(kù)部分是整個(gè)設(shè)計(jì)的核心,考慮系統(tǒng)的規(guī)模和現(xiàn)有計(jì)算機(jī)的配置,也為了系統(tǒng)更易于實(shí)現(xiàn)和維護(hù),采用Microsoft Access桌面型數(shù)據(jù)庫(kù)系統(tǒng),同時(shí)結(jié)合VBA開(kāi)發(fā)工具,設(shè)計(jì)了“通用題庫(kù)管理系統(tǒng)”。該系統(tǒng)提供了試題編輯功能、自動(dòng)和手動(dòng)組卷功能、設(shè)置試題數(shù)量和卷面難度等功能,整套試卷及答卷的最終格式為Word文件,便于試卷修改和調(diào)整。
3 系統(tǒng)總體設(shè)計(jì)
根據(jù)系統(tǒng)的需求我們把系統(tǒng)分成用戶管理、題庫(kù)管理、試卷管理、數(shù)據(jù)庫(kù)管理四個(gè)大模塊,如圖1所示。用戶管理模塊可對(duì)用戶進(jìn)行管理,用戶類型包括管理員和一般用戶,管理員可以添加用戶和刪除用戶、權(quán)限設(shè)置;題庫(kù)管理分為增加試題、刪除試題、修改試題、瀏覽試題四個(gè)模塊,一般用戶只能瀏覽試題;試卷管理模塊分為自動(dòng)組卷、手動(dòng)組卷、試卷瀏覽三個(gè)模塊,在自動(dòng)組卷方式下需選擇試題類型、難度和試題數(shù)量等。數(shù)據(jù)庫(kù)管理分為壓縮數(shù)據(jù)庫(kù)、備份數(shù)據(jù)庫(kù)、恢復(fù)數(shù)據(jù)庫(kù)三個(gè)模塊。
3.1數(shù)據(jù)庫(kù)結(jié)構(gòu)
數(shù)據(jù)庫(kù)設(shè)計(jì)的合理與否,對(duì)數(shù)據(jù)的完整性、安全性、程序運(yùn)行的效率和程序設(shè)計(jì)的復(fù)雜程度等有著十分密切的關(guān)系。因一般題庫(kù)規(guī)模較小,故只需建立一個(gè)數(shù)據(jù)庫(kù),在此數(shù)據(jù)庫(kù)基礎(chǔ)上,建立相關(guān)數(shù)據(jù)庫(kù)表,屬性如表1。
試題庫(kù)中的難度、所屬章節(jié)、知識(shí)點(diǎn)、使用次數(shù)、上次使用年份,主要用作選題時(shí)的參考,題型可以是選擇題、判斷題、填空題、問(wèn)答題等,題目?jī)?nèi)容存儲(chǔ)試題的文本信息,若有公式、圖片、表格等,則以Word文檔形式用OLE對(duì)象存于素材字段中。試卷庫(kù)與試題庫(kù)屬性相同,只是將選中的試題存于其中用作考試組卷。
4 系統(tǒng)關(guān)鍵技術(shù)及實(shí)現(xiàn)
4.1 數(shù)據(jù)庫(kù)操作
為便于對(duì)Access數(shù)據(jù)庫(kù)進(jìn)行操作,在VB.NET中可首先添加引用“ADODB”,并在標(biāo)準(zhǔn)模塊中加入以下語(yǔ)句:
Public cnn As ADODB.Connection
Public cmd As ADODB.Command
Public rst As ADODB.Recordset
Public Const mydbf As String = \" testdb.mdb\"‘試題數(shù)據(jù)庫(kù)
Public Const strCon As String = \" Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = gcbz.mdb ;Jet OLEDB:Database Password=asdf \"
這樣在程序設(shè)計(jì)時(shí),若需打開(kāi)數(shù)據(jù)表進(jìn)行操作,只須加入語(yǔ)句:
cnn.Open(strCon)
rst.Open(strCom, cnn)
其中strCom為相關(guān)選擇語(yǔ)句,如:
strCom = \" SELECT * FROM 試題庫(kù) WHERE 題型=testtype \" ‘testtype為選擇的考試題型。
該語(yǔ)句表示從試題庫(kù)表中選擇“題型=testtype”的記錄,這樣就可獲得表中相應(yīng)數(shù)據(jù)。
4.2 圖形、公式等數(shù)據(jù)存取
由于試題庫(kù)中的圖形、公式等內(nèi)容,都是以O(shè)LE 對(duì)象的數(shù)據(jù)形式存貯在數(shù)據(jù)庫(kù)中,對(duì)這些數(shù)據(jù)的管理,不能直接用一般文本數(shù)據(jù)的管理方式,要通過(guò)VB.NET中的FileStream流及MemoryStream流完成。以下函數(shù)Ole2File就是通過(guò)MemoryStream流,讀取數(shù)據(jù)庫(kù)中的OLE 對(duì)象數(shù)據(jù),再經(jīng)FileStream流將其另存為一文件。
Private Sub Ole2File(ByVal DestFilePath As String, ByVal keyword As String, ByVal keyname As String)
Dim PictureCol As Integer = 0 ' the column # of the BLOB field
Dim cn As New OleDbConnection(strCon)
Dim cmd As New OleDbCommand(\"SELECT \" + keyname + \" FROM win WHERE ID=\" keyword, cn)
cn.Open()
Dim dr As OleDbDataReader = cmd.ExecuteReader()
dr.Read()
Dim b(dr.GetBytes(PictureCol, 0, Nothing, 0, Integer.MaxValue) - 1) As Byte
dr.GetBytes(PictureCol, 0, b, 0, b.Length)
dr.Close()
cn.Close()
Dim ms As New MemoryStream(b)
Dim testfile As String = \"C:\\windows\emp\\\"
Dim FSO As New FileSystemObject()
Dim fs As New System.IO.FileStream(testfile + DestFilePath, IO.FileMode.Create, IO.FileAccess.Write)
fs.Write(b, 0, b.Length)
fs.Close()
End Sub
利用上述模塊,即可將數(shù)據(jù)庫(kù)存貯的OLE對(duì)象數(shù)據(jù),還原為對(duì)應(yīng)文檔,完成數(shù)據(jù)的提取工作。
4.3 文本、參考答案的加密
試題庫(kù)中的內(nèi)容,雖可通過(guò)用戶權(quán)限管理加以保密,但用戶還可通過(guò)其它軟件打開(kāi)試題庫(kù),為保證數(shù)據(jù)庫(kù)中的數(shù)據(jù)安全,必須對(duì)試題庫(kù)中重要內(nèi)容如試題內(nèi)容,以加密方式進(jìn)行存儲(chǔ),這樣即使用非法方式打開(kāi)試題庫(kù),也能保證試題安全,因此數(shù)據(jù)加密解密必不可少。在VB.NET可利用CryptoStream流中DESCryptoServiceProvider類的CreateEncryptor進(jìn)行加密,CreateDecryptor解密,然后通過(guò)MemoryStream流完成數(shù)據(jù)轉(zhuǎn)換。
加密函數(shù)代碼如下:
Public Function EncryptData(ByVal Value As String, ByVal desKey() As Byte, ByVal desIV() As Byte)
Dim ms As New MemoryStream()
Dim byt() As Byte
Dim bin(4096) As Byte '這是加密的中間存儲(chǔ)器
Dim rdlen As Long = 8 '這是寫(xiě)的字節(jié)的總數(shù)。
Dim len As Integer '這是被一次寫(xiě)的字節(jié)的數(shù)量.
Dim des As New DESCryptoServiceProvider()
Dim cs As New CryptoStream(ms, des.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write)
byt = Encoding.UTF8.GetBytes(Value)
cs.Write(byt, 0, byt.Length)
cs.FlushFinalBlock()
cs.Close()
Return Convert.ToBase64String(ms.ToArray())
End Function
解密函數(shù)代碼如下:
Public Function deEncryptData(ByVal Value As String,ByVal desKey() As Byte, ByVal desIV() As Byte)
Dim ms As New MemoryStream()
Dim byt() As Byte
Dim bin(4096) As Byte
Dim rdlen As Long = 8
Dim len As Integer
Dim des As New DESCryptoServiceProvider()
Dim cs As New CryptoStream(ms, des.CreateDecryptor(desKey, desIV), CryptoStreamMode.Write)
byt = Convert.FromBase64String(Value)
cs.Write(byt, 0, byt.Length)
cs.FlushFinalBlock()
cs.Close()
Return Encoding.UTF8.GetString(ms.ToArray())
End Function
4.4 試題錄入、編輯與刪除的設(shè)計(jì)
由于試題特殊的符號(hào)、公式、圖形、表格等,系統(tǒng)必須具備各學(xué)科特殊符號(hào)和圖表的處理能力,同時(shí)還須具備有圖形、圖像、表格方便的輸入及圖文合一的操作接口。試題的錄入、編輯和刪除由系統(tǒng)試題編輯器來(lái)完成,在試題編輯器上設(shè)有試題參數(shù)選項(xiàng)欄、試題的添加、刪除以及題目和答案的導(dǎo)入、編輯等按鈕,在試題編輯里,用戶設(shè)置好當(dāng)前試題的參數(shù)后,點(diǎn)擊編輯按鈕,系統(tǒng)通過(guò)System.Diagnostics.Process.Start會(huì)自動(dòng)啟動(dòng)Word程序,用戶就可以按照Microsoft Word的操作方式來(lái)進(jìn)行試題的錄入和編輯,并且根據(jù)各學(xué)科的需要,插入復(fù)雜的圖形、表格和公式等。編輯完成后保存并關(guān)閉Word程序;點(diǎn)擊導(dǎo)入按鈕,系統(tǒng)調(diào)用Ole2File模塊,自動(dòng)將題目導(dǎo)人題庫(kù)中。
4.5 自動(dòng)組卷和手工組卷
自動(dòng)組卷主要根據(jù)用戶為試卷給出的難度、題型以及各種題型的題數(shù)自動(dòng)生成一份試卷。本系統(tǒng)選題算法的要求為:各種難度的試題數(shù)量比例及試題數(shù)量可以調(diào)節(jié);試題不能重復(fù)。在預(yù)覽試卷總體布局之前,允許用戶將系統(tǒng)選擇好的題目做適當(dāng)?shù)恼{(diào)換,然后將選擇好的題目保存為一份試卷,并將數(shù)據(jù)庫(kù)中的有關(guān)題目的使用年份更改為當(dāng)前年份,如果數(shù)據(jù)庫(kù)中的表的相應(yīng)的記錄的年份與當(dāng)前年份相隔兩年則將該記錄變?yōu)榭芍匦吕谩?/p>
手動(dòng)挑選題目組卷方式不要求用戶提供任何信息,系統(tǒng)會(huì)將當(dāng)前數(shù)據(jù)庫(kù)中的所有可供挑選的題目都顯示出來(lái),讓使用者自己挑選題目,與此同時(shí),系統(tǒng)會(huì)給出每道題目的相應(yīng)的信息,諸如:難度、分值、是否有圖形、使用的次數(shù)等供用戶參考。手動(dòng)生成試卷向?qū)Я鞒膛c自動(dòng)選題中的手動(dòng)掉換題目相似。
4.6 試卷文件生成方法
系統(tǒng)最終生成的考卷格式為Microsoft Word文檔文件。系統(tǒng)通過(guò)Microsoft Word支持的VBA功能,實(shí)現(xiàn)Word文檔的自動(dòng)生成,即Word文件的創(chuàng)建、插入文字圖片、保存等過(guò)程都完全由系統(tǒng)自動(dòng)完成。系統(tǒng)抽取的試卷最終要以Word的形式保存或者打印出來(lái),因此制作Word試卷就顯得尤為重要。Word 2003提供的VBA組件為系統(tǒng)實(shí)現(xiàn)這個(gè)功能提供了強(qiáng)有力的保障,Word 2003共有193個(gè)對(duì)象,其中位于最高層的是Application對(duì)象,它實(shí)際代表整個(gè)Word 2003應(yīng)用程序,是VBA控制Word 2003應(yīng)用程序的關(guān)鍵所在。Word 2003應(yīng)用程序中所有的功能都可以通過(guò)這193個(gè)對(duì)象控制完成,例如Documents集合對(duì)象和Document對(duì)象可以獲得所有打開(kāi)的文檔和當(dāng)前活動(dòng)文檔。在自動(dòng)生成過(guò)程中,幾個(gè)主要步驟:① 首先在VB中創(chuàng)建好Word文檔,并通過(guò)代碼對(duì)該文檔進(jìn)行一些必要的屬性設(shè)置(比如頁(yè)邊距、字體、對(duì)齊方式等),②把相應(yīng)的題目和答案寫(xiě)入到Word文檔中,③保存為某個(gè)文件,④關(guān)閉文檔,釋放資源。本系統(tǒng)利用這個(gè)技術(shù)實(shí)現(xiàn)組建Word試卷的部分代碼如下:
Set wordobj= CreateObject( word.a(chǎn)pplication )
changeFileOpenDirectory [路徑]
Documents.Open FileName:=testname
ActiveDocument.SaveAs FileName:=testnew
Selection.InsertFile FileName:= suiji .rtf
Set newDoc =Nothing
5 結(jié)束語(yǔ)
本文以Access數(shù)據(jù)庫(kù)為基礎(chǔ),采用VBA與VB.NET及Word相結(jié)合技術(shù),共享不同的應(yīng)用程序信息資源,實(shí)現(xiàn)文本、圖形、公式等為一體的復(fù)合文檔和文檔的編輯,實(shí)現(xiàn)了試題庫(kù)的實(shí)時(shí)管理和試卷、答案的控制輸出,較好地保證了系統(tǒng)的有效性、可擴(kuò)展性、開(kāi)放性、可移植性,縮短了開(kāi)發(fā)周期,同時(shí)為教師提供了方便高效的工作平臺(tái),減輕了工作負(fù)擔(dān),提高了試題管理的工作效率,具有較好的實(shí)用和推廣價(jià)值。
參考文獻(xiàn):
[1] Microsoft著,VB.NET程序設(shè)計(jì)語(yǔ)言[M],高等教育出版社,2003.
[2] [美]Michael Halvorson著,VISUAL BASIC.NET程序設(shè)計(jì)[M],清華大學(xué)出版社,2002.
[3] 精銳創(chuàng)作組編著,Visual Basic.NET實(shí)用編程技術(shù)[M],人民郵電出版社,2001.
[4] 張志兵,王嫦娟,基于VB的工程圖學(xué)試題庫(kù)系統(tǒng)的設(shè)計(jì)[J],山東科技大學(xué)學(xué)報(bào)(自然科學(xué)版),2005(24,3):18-20.
[5] 田麗平,基于VB.NET的在線智能考試系統(tǒng)開(kāi)發(fā)與實(shí)現(xiàn)[J],佛山科學(xué)技術(shù)學(xué)院學(xué)報(bào)(自然科學(xué)版),2O07,(25,4):20-23.