作者簡介:
龍瓊芳(1982年2月),女,漢族,湖南攸縣人,現(xiàn)任教于廣東省東莞市經(jīng)濟貿(mào)易學校計算機科組,講師,碩士學位,研究方向:軟件工程。
摘要:針對SQL(結構化查詢語言)課程操作考試的組卷和閱卷中的實際問題,對VB訪問SQL Server 2000 數(shù)據(jù)庫使用的ADO技術進行了闡述,論述采用VB結合SQL Server 2000實現(xiàn)SQL考試隨機組卷改卷系統(tǒng)設計的依據(jù)和實現(xiàn)方法,并給出了系統(tǒng)開發(fā)過程中所需的一些關鍵技術的程序代碼。
關鍵詞:ADO VB SQL 隨機組卷 自動閱卷
中圖分類號:G712文獻標識碼:A 文章編號:1672-3791(2012)01(a)-0000-00
1 問題的提出
SQL是結構化查詢語言的簡稱,課程目標是要求學生掌握在SQL Server 2000中編寫查詢的能力,在教學過程中每次課每個學生都需要完成大量的練習,由于每一個查詢都是一個獨立的“.sql”文件,因此如果采用人工檢查的方式不但工作量大而且容易出錯。而使用計算機輔助改題不但速度快而且效率高。
此外,為了避免考試的時候相鄰學生互相抄襲、減少考生作弊的情況,用計算機生成試卷也利實行隨機組卷。
2 設計思想、關鍵技術和關鍵問題
SQL課程練習和考試都在SQL Server 2000 下完成,每一個小題都是一個獨立的“.sql”文件。因此改卷的過程就是驗證每一個“.sql”文件在SQL Server 2000環(huán)境下執(zhí)行的結果是否正確的過程。SQL練習和考試的題目都是一個個獨立的查詢要求,例如:請查詢“學生課程”數(shù)據(jù)庫中姓“何”或“蘇”的教師且學時數(shù)大于70的教師名和學時數(shù)。因此出卷的過程就是將一組難度分布合理的查詢題目列出來。為了能夠單獨使用組卷和改卷兩個模塊,例如平時練習時題目是固定的只需要使用改卷部分,這兩個模塊并不整合在一起而是獨立開來的。
系統(tǒng)包括試題數(shù)據(jù)庫、題庫數(shù)據(jù)庫、改卷程序、組卷程序,其中,試題數(shù)據(jù)庫是指題目本身進行查詢或修改操作的數(shù)據(jù)庫,題庫數(shù)據(jù)庫是存放所有試題的數(shù)據(jù)庫,改卷程序和組卷程序均由Visual Basic 6.0編寫,標準答案和學生答案均為一組“.sql”文件,生成的試卷可以選擇文本文檔或者word文檔。
2.1 Visual Basic訪問SQL Server數(shù)據(jù)庫技術
使用Visual Basic作為前端開發(fā)語言,與SQL Server接口有幾種常用的方法,即:數(shù)據(jù)訪問對象/Jet、為ODBC API編程、使用SQL Server的Visual Basic庫(VBSQL)為DB庫的API編程、ADO 數(shù)據(jù)對象(Active Data Objects)。以上幾種訪問SQL Server的方法各有各的特點。DAOs方法是基于對象的,因而便于使用,但是它是從Visual Basic到SQL Server最慢的連接方式。ODBC API和VBSQL方法從本質(zhì)上講是基于程序的。ODBC API方法通用性好,允許最強的互操作性,編程簡單,但速度慢于VBSQL方法。VBSQL方法通過VBSQL控件,提供了重要的SQL Server前端應用程序所需的靈活性、強大功能和良好性能。它具有真正的事件驅動及錯誤處理能力,完全支持異步處理、游標和計算列等。這些都是VBSQL方法超出其它方法的優(yōu)勢,但其編程稍復雜。
2.2 ADO技術
ADO向我們提供了一個熟悉的,高層的對OLE DB的Automation封裝接口。對那些熟悉RDO的程序員來說,你可以把OLE DB比作是ODBC驅動程序。如同RDO對象是ODBC驅動程序接口一樣,ADO對象是OLE DB的接口;如同不同的數(shù)據(jù)庫系統(tǒng)需要它們自己的ODBC驅動程序一樣,不同的數(shù)據(jù)源要求它們自己的OLE DB提供者(OLE DB provider)。
ADO向VB程序員提供了很多好處。包括易于使用,熟悉的界面,高速度以及較低的內(nèi)存占用。同傳統(tǒng)的數(shù)據(jù)對象層次(DAO和RDO)不同,ADO可以獨立創(chuàng)建。因此你可以只創(chuàng)建一個”Connection”對象,但是可以有多個、獨立的”Recordset”對象來使用它。
2.3 改卷的依據(jù)
檢驗學生答案是否正確有兩種方法:
②判定過程
判定過程即分析學生的“.sql”文件是否正確。例如:請查詢“學生課程”數(shù)據(jù)庫中姓“何”或“蘇”的教師且學時數(shù)大于70的教師名和學時數(shù)。
標準的答案應該為:
use 學生課程
select 教師名,學時數(shù)
from 授課表
where (教師名 like ‘何%’or 教師名 like ‘蘇%’)and(學時數(shù)>70)
go
如果學生的答案與標準答案一致則判定該題得分。方法是讀取學生的“.sql”文件和標準答案的“.sql”文件,進行比對。這種方法的優(yōu)點在于實現(xiàn)簡單,執(zhí)行的效率高,改題速度快,但是也有一些缺點。
A.比對的過程中有些字符甚至語句是結果無關的。例如這里的“use 學生課程”,在實際做題時本條語句若缺不影響查詢。因此對比前應先把學生答案和標準答案中這些結果無關的語句刪除。再如學生若在“from”和“授課表”中間插入了若干空格,由于這些空格不影響語句的執(zhí)行,因此對比前應也先把學生答案和標準答案中這些空格刪除。但是如果學生答案是“fr om”,在“fr”和“om”中間插入了若干空格則應視為錯誤答案,因為這在查詢中將影響查詢的結果。因此像這樣位置不同時有可能結果無關也可能結果相關的字符在實際處理起來比較困難。這種情況一般是學生的誤操作導致,學生只要在做題之后執(zhí)行查詢檢查一下就能發(fā)現(xiàn),因此這種情況發(fā)生的概率非常小,不過仍有可能。
B.有些查詢可能有多種方法實現(xiàn),例如上面的查詢也可以編寫查詢?nèi)缦?/p>
use 學生課程
select 教師名,學時數(shù)
from 授課表
where (教師名 like ‘何%’ and 學時數(shù)>70)or (教師名 like ‘蘇%’ and 學時數(shù)>70)
go
加下劃線的部分有了較大的改變,但實際與where (教師名 like ‘何%’or 教師名 like ‘蘇%’)and(學時數(shù)>70)是一樣的。這樣有多種方法實現(xiàn)的查詢在練習和考試中非常多。
因此,使用判定過程的方法有可能導致判斷錯誤。原因A導致原本錯誤的答案判為正確,而原因B導致原本正確的答案判為錯誤。
② 判定結果
判定結果與判定過程正好相反,不關心學生是如何編寫“.sql”文件的,而是執(zhí)行“.sql”文件然后判斷結果是否與標準答案的執(zhí)行結果相同。
這種方法可以避免上述的原因A和原因B所導致的錯誤判斷,是比較理想的判斷方法。只要仔細的設置試題數(shù)據(jù)庫中的記錄和數(shù)據(jù)就能使得不同的查詢具有不同的結果記錄集合,因而可以避免不同的查詢結果相同,也就不會出現(xiàn)錯判的現(xiàn)象。
但是這種方法也有缺點,由于要對比學生答案的執(zhí)行結果和標準答案的執(zhí)行結果,就必須至少訪問試題數(shù)據(jù)庫兩次,這樣改卷的速度必然會慢很多。
綜合分析以上兩種判定方法的優(yōu)缺點,可以設定先用判定過程比對兩個答案,若比對結果不相同再進行結果判定。這樣既兼顧了改卷的速度又可較大限度的避免錯判。
2.4 試題的設置
根據(jù)考試和改卷的需要,試題的設置需要遵循以下原則:
2.4.1 難易結合,涵蓋所有知識點
對試題根據(jù)考查的知識點和難易程度進行分類,隨機抽題時依據(jù)這種分類進行組卷,使得得到的試卷能夠覆蓋大部分知識點并可以兼顧難易不同程度的比例。這樣可以避免不同學生抽取的試卷難度不一、考查知識點較偏等問題,使得生成的試卷真正反映學生的實際掌握情況。
2.4.2 試題之間沒有交叉干擾
前面的試題不能影響后續(xù)試題的完成結果。例如,如果有試題要更新學號為“200009001”的學生記錄,則之前不能有刪除查詢刪除該記錄,也不能有更新查詢修改該學生的學號。
因此正確安排題目的順序非常重要,也可以在題庫數(shù)據(jù)庫中設置一字段使得某些題目不能同時被抽中。
因此在隨機抽題組成的一份試卷中,選擇查詢的試題要在前,動作查詢的試題應放在選擇查詢后,且所有的動作查詢試題所操作的記錄均不能相同。
2.4.3 所有查詢結果集合要包括特征記錄和邊緣記錄
采用判定結果方法驗證答案的時候,如果試題數(shù)據(jù)庫中的記錄數(shù)量不夠、或者沒有特征記錄、或者沒有邊緣記錄、或者這些記錄不完整,都會導致判斷錯誤。
查詢得到的是一個記錄集合,在這個記錄集合中,有些記錄位于集合中間被稱為特征記錄,有些位于集合邊緣被稱為邊緣記錄。特征記錄反映了這個查詢的一般性,而邊緣記錄反映了這個查詢的特殊性。
例如:1、查找成績小于等于80的學生記錄。在結果集合中成績?yōu)?0的記錄就是一個特征記錄;而成績?yōu)?0的就是這個查詢的邊緣記錄。
再如:2、查找成績大于60的學生記錄。在結果集合中成績?yōu)?0的記錄就是一個特征記錄;而成績?yōu)?0的記錄雖然不在結果集合中,但位于集合的邊緣,它也是一個邊緣記錄。
在以上兩個例子中:如果例1的試題數(shù)據(jù)庫中沒有成績?yōu)?0的記錄,則如果學生的實際查詢?yōu)椤安檎页煽冃∮?0的學生記錄”所得到的結果集合將與預期的結果集合相同。如果例2的試題數(shù)據(jù)庫中沒有成績?yōu)?0的記錄,一旦學生的實際查詢?yōu)椤安檎页煽兇笥诘扔?0的學生記錄” 所得到的結果集合也會與預期的結果集合相同。這樣就會產(chǎn)生誤判。
因此,在設計試題數(shù)據(jù)庫的時候,一定要分析試題本身,找出所有的邊緣特征記錄和一定數(shù)量的特征記錄。試題數(shù)據(jù)庫必須涵蓋這些記錄,采用結果判定才不會出現(xiàn)錯判的情況。
3 隨機組卷程序的設計和實現(xiàn)
組卷程序重點包括連接題庫數(shù)據(jù)庫,抽取試題,最后斷開題庫數(shù)據(jù)庫等操作。
3.1 連接題庫數(shù)據(jù)庫的代碼
(其中Text1.Text為題庫數(shù)據(jù)庫所在服務器名或IP)
‘創(chuàng)建對象
Dim objcn As Connection
Dim objcom As Command
Dim objrs As Recordset
‘實例化對象
Set objcn = New Connection
Set objcom = New Command
Set objrs = New Recordset
‘創(chuàng)建數(shù)據(jù)庫連接
objcn.Provider = “SQLOLEDB”
objcn.ConnectionString = “User ID=sa;PWD=;Data Source=” + Text1.Text + “;Initial Catalog=SQL期末考試試題”
RichTextBox1.Text = “SQL期末考試試題” vbCrLf
3.2 斷開題庫數(shù)據(jù)庫的代碼
‘斷開連接
objcn.Close
‘釋放連接
Set objcn = Nothing
3.3抽取試題的代碼如下:(以生成第一大題的代碼為例)
‘生成第一大題
For i = 1 To 12
Label1: Randomize ‘ 對隨機數(shù)生成器做初始化的動作。
MyValue = Int((102 * Rnd) + 1001) ‘ 生成 1001 到 1102 之間的隨機數(shù)值。
For j = 1 To i – 1
If one(j) = MyValue Then
GoTo Label1:
End If
Next j
one(i) = MyValue
Next i
4 改卷程序的設計和實現(xiàn)
改卷程序依次讀取學生的.sql文件,全部讀取并改卷后退出。
4.1 讀取學生文件和初始化學生文件代碼如下:
‘讀取學生文件
Open Dir1.Path “\” title For Input As #1
Do While Not EOF(1)
Line Input #1, s_add
‘將大寫字母轉換為小寫字母
s_add = LCase(s_add)
‘去除go
s_add = Replace(s_add, “go”, “”)
s_stu_show = s_stu_show + s_add + Chr(13) + Chr(10)
‘去除空格
s_add = Replace(s_add, “ “, “”)
‘去除引號
s_add = Replace(s_add, “’”, “”)
‘去除回車
‘s_add = Replace(s_add, “’”, “”)
If pos = InStr(1, s_add, “/*”) < 0 Then
‘獲取文檔內(nèi)容
s_stu = s_stu + s_add
End If
Loop
Close #1
4.2 判斷結果集合是否相同代碼如下:
'分別執(zhí)行兩個語句,判斷結果是否相同
temp = \"Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=\" + temp + \";Data Source=\" + Text4.Text
Adodc1.ConnectionString = temp
Adodc2.ConnectionString = temp
Adodc1.Enabled = True
Adodc1.Enabled = True
Adodc1.RecordSource = s_stu_show
Adodc2.RecordSource = s_ansr_show
Adodc1.Refresh
On Error GoTo tag2:
Adodc2.Refresh
5 總結和展望
在期中考試和期末考試以及部分平時練習中使用了這個組卷改卷系統(tǒng),運行良好,無故障,改卷的效率也有很大的提高,基本達到了最初的目的。但由于時間倉促,本系統(tǒng)有很多有待改進的地方,主要總結如下:
1、系統(tǒng)的安全性較差。在程序中實現(xiàn)了拒絕學生重復抽題的代碼,這在一定程度上避免了學生人為選題的操作,有一定的安全考慮。并且考試的時候題庫數(shù)據(jù)庫位于教師機上,抽題領卷在學生機器上,但是由于數(shù)據(jù)庫所在的一端并沒有編寫服務器代碼,學生通過領卷程序直接訪問教師機上的題庫數(shù)據(jù)庫,造成了數(shù)據(jù)的安全性較差。若將題庫數(shù)據(jù)庫、領卷程序、服務程序分置三臺機器上則可大大提高安全性能。同時也可避免一部分較聰明的學生直接訪問題庫數(shù)據(jù)庫的可能。
2、系統(tǒng)的應用范圍較窄。本系統(tǒng)是針對SQL一門課程設計和編寫的,因此講授完本門課程后該系統(tǒng)很難修改應用到其它課程的組卷和改卷中來。且一旦試題改動了,試題數(shù)據(jù)庫也要隨之改動(原因見二.4.③),使得擴充試題比較難。如果能夠找到一種方法自動尋找邊緣記錄,則擴充試題后可自動調(diào)整試題數(shù)據(jù)庫,則應用的范圍將大大擴展。
參考文獻
[1] 宋琦凡,付敬平.《使用Visual Basic開發(fā)數(shù)據(jù)庫應用軟件》.北京:電子工業(yè)出版社
[2] Evangelos Petroutsos. 《Visual Basic從入門到精通》.北京:電子工業(yè)出版社
[3] 孟小峰.《開放數(shù)據(jù)庫互連—ODBC 2.0使用大全》.北京:清華大學出版社
[4] 廖衛(wèi)東,趙軍.《Visual Basic編程手冊》.北京:機械工業(yè)出版社
[5] 《電腦編程技巧與維護》