郝耀軍 王建國(guó) 趙青杉 王 宇
【摘要】SQLTutor是自主開發(fā)的一套SQL查詢語(yǔ)言智能學(xué)習(xí)系統(tǒng),它利用在線實(shí)驗(yàn)組織教學(xué),在實(shí)驗(yàn)平臺(tái)上集成了資源學(xué)習(xí)、案例演示、在線討論、綜合測(cè)試等內(nèi)容。SQLTutor最大的優(yōu)勢(shì)在于開放地允許學(xué)生對(duì)同一問題用不同的查詢語(yǔ)句來(lái)實(shí)現(xiàn),有利于提高學(xué)生的問題解決能力。論文剖析了SQLTutor實(shí)驗(yàn)平臺(tái)的工作機(jī)制及特點(diǎn),討論了實(shí)驗(yàn)語(yǔ)句的語(yǔ)法錯(cuò)誤和邏輯錯(cuò)誤的診斷技術(shù)。實(shí)踐證明,利用開放的在線實(shí)驗(yàn)技術(shù)有效地提高了學(xué)生的學(xué)習(xí)效果。
【關(guān)鍵詞】SQL查詢語(yǔ)言;在線實(shí)驗(yàn);錯(cuò)誤診斷;建構(gòu)主義
【中圖分類號(hào)】G40-057 【文獻(xiàn)標(biāo)識(shí)碼】A 【論文編號(hào)】1009—8097(2009)08—0109—03
引言
SQL語(yǔ)言(Structured Query Language)是數(shù)據(jù)庫(kù)的核心語(yǔ)言,自IBM公司在上世紀(jì)80年代推出以來(lái),得到了廣泛的應(yīng)用。
SQL語(yǔ)言雖然有結(jié)構(gòu)簡(jiǎn)潔、簡(jiǎn)單易學(xué)的特點(diǎn),但在SQL語(yǔ)言的實(shí)際教學(xué)中,學(xué)生往往是“上課一聽就懂,上機(jī)無(wú)法下手”。這種情況一方面是由于學(xué)生上機(jī)實(shí)驗(yàn)受時(shí)空限制,理論學(xué)習(xí)和上機(jī)操作不能同步進(jìn)行,造成了理論學(xué)習(xí)時(shí)的情境缺失和上機(jī)實(shí)驗(yàn)時(shí)的智力支持缺失;另一方面是由于RDBMS(關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng))的交互不友好,對(duì)邏輯錯(cuò)誤的診斷能力不強(qiáng),造成學(xué)生只知道自己的SQL語(yǔ)言是錯(cuò)誤的,不知道錯(cuò)在什么地方,學(xué)生上機(jī)實(shí)驗(yàn)時(shí)往往淺嘗輒止。
我們認(rèn)為解決上述問題較好的辦法是引入在線實(shí)驗(yàn)技術(shù),將理論學(xué)習(xí)與上機(jī)操作融為一體,排除實(shí)際上機(jī)學(xué)習(xí)環(huán)境中軟硬件的干擾,讓學(xué)生在“做”精心設(shè)計(jì)的上機(jī)實(shí)驗(yàn)的過程中自主建構(gòu)知識(shí)體系,同時(shí)提供資源學(xué)習(xí)、案例演示、在線討論、綜合測(cè)試等服務(wù)。
目前,在虛擬實(shí)驗(yàn)室的發(fā)展上存在兩種趨勢(shì),一種是對(duì)仿真技術(shù)的深入研究和應(yīng)用,這要求仿真軟件能最大程度地描述實(shí)驗(yàn)情形[1];另一種是虛擬實(shí)驗(yàn)技術(shù)的研究和應(yīng)用,這同時(shí)也需要人工智能技術(shù)的支持[2]。
基于以上分析,我們針對(duì)SQL語(yǔ)言可提交到數(shù)據(jù)庫(kù)接口執(zhí)行的特殊性,開發(fā)了SQL查詢語(yǔ)言智能教學(xué)系統(tǒng)——SQLTutor,利用在線實(shí)驗(yàn)的學(xué)習(xí)方式輔助學(xué)生學(xué)習(xí)SQL語(yǔ)言,免去了學(xué)生實(shí)際上機(jī)安裝、配置數(shù)據(jù)庫(kù)和建立各種數(shù)據(jù)表的過程,便于學(xué)生集中精力學(xué)習(xí)主要內(nèi)容,提高動(dòng)手操作能力,也便于教師控制學(xué)生的學(xué)習(xí)過程。本文將重點(diǎn)介紹SQLTutor在線實(shí)驗(yàn)平臺(tái)的工作機(jī)制及對(duì)錯(cuò)誤實(shí)驗(yàn)語(yǔ)句的診斷技術(shù)。
一 實(shí)驗(yàn)平臺(tái)的工作機(jī)制
在本實(shí)驗(yàn)平臺(tái)主要提供SQL查詢語(yǔ)句的實(shí)驗(yàn),這里沒有利用關(guān)系數(shù)據(jù)庫(kù)的前臺(tái)查詢接口,而是直接通過用戶瀏覽器來(lái)進(jìn)行。在線實(shí)驗(yàn)平臺(tái)主要利用.NET平臺(tái)中的ADO.NET技術(shù)來(lái)執(zhí)行通過瀏覽器提交到服務(wù)器的SQL語(yǔ)句,并將服務(wù)器的執(zhí)行結(jié)果返回到客戶端,其工作界面如圖1所示。
實(shí)驗(yàn)平臺(tái)的工作機(jī)制如圖2所示,本實(shí)驗(yàn)平臺(tái)對(duì)數(shù)據(jù)流進(jìn)行的是只讀、只進(jìn)的檢索,可以使用ADO.NET中的 DataReader來(lái)提高應(yīng)用程序的性能并減少系統(tǒng)開銷。因?yàn)橐坏?shù)據(jù)可用,DataReader方法就立即檢索該數(shù)據(jù),而不是等待返回查詢的全部結(jié)果;查詢結(jié)果在查詢執(zhí)行時(shí)返回,存儲(chǔ)在客戶端的網(wǎng)絡(luò)緩沖區(qū)中,直到使用DataReader的Read方法對(duì)它們發(fā)出請(qǐng)求。
當(dāng)創(chuàng)建 Command 對(duì)象的實(shí)例后,可調(diào)用 Command.ExecuteReader 從數(shù)據(jù)源中檢索行,從而創(chuàng)建一個(gè) DataReader。
提交到服務(wù)器執(zhí)行文本框中學(xué)生錄入的SQL語(yǔ)句的關(guān)鍵代碼片段如下所示:
{
string exsql;//exsql為學(xué)生的實(shí)驗(yàn)語(yǔ)句
string stsql;//stsql為實(shí)驗(yàn)平臺(tái)中提供的標(biāo)準(zhǔn)實(shí)驗(yàn)語(yǔ)句
exsql=Session["exsql"].ToString().Trim();
stsql=Session["ssql"].ToString().Trim();
SqlConnection myconn=new SqlConnection("Data Source=hyj;Integrated Security=SSPI;Initial Catalog=material"); //連接數(shù)據(jù)庫(kù)
myconn.Open(); //打開連接
SqlCommand mycomm=newSqlCommand(exsql+";"+stsql,myconn);//建立Command對(duì)象,執(zhí)行學(xué)生實(shí)驗(yàn)語(yǔ)句和標(biāo)準(zhǔn)實(shí)驗(yàn)語(yǔ)句
SqlDataReader myreader;
myreader=mycomm.ExecuteReader();//生成查詢結(jié)果集
}
二 實(shí)驗(yàn)語(yǔ)句的錯(cuò)誤診斷技術(shù)
學(xué)生實(shí)驗(yàn)的SQL語(yǔ)句要提交到服務(wù)器端執(zhí)行,在這個(gè)環(huán)節(jié)系統(tǒng)必須判別學(xué)生寫的SQL語(yǔ)句的語(yǔ)法錯(cuò)誤和邏輯錯(cuò)誤。
1 語(yǔ)法錯(cuò)誤的處理
主要利用后臺(tái)數(shù)據(jù)庫(kù)的錯(cuò)誤提示由系統(tǒng)加工后反饋給學(xué)生,比如學(xué)生寫出“select from sinfo”這樣的SQL語(yǔ)句,很明顯提交到服務(wù)器端是無(wú)法執(zhí)行的。對(duì)于這類錯(cuò)誤我們利用SQL Server2000的錯(cuò)誤反饋技術(shù),在錯(cuò)誤診斷中捕捉并加工這些后臺(tái)錯(cuò)誤信息,然后在網(wǎng)頁(yè)中反饋給用戶。
在線實(shí)驗(yàn)平臺(tái)判斷語(yǔ)法錯(cuò)誤并反饋錯(cuò)誤信息的主要代碼如下:
catch(SqlException exc)
{
Response.Write(exc.Message.ToString()+exc.Number);
} //有語(yǔ)法錯(cuò)誤時(shí)返回錯(cuò)誤信息,exc.Message為提示信息,exc.Number為代號(hào)。
如上例的“select from sinfo”語(yǔ)句在本實(shí)驗(yàn)平臺(tái)提交后會(huì)給出錯(cuò)誤反饋信息“在關(guān)鍵字 'from' 附近有語(yǔ)法錯(cuò)誤”。
2 邏輯錯(cuò)誤的處理
邏輯錯(cuò)誤往往不易為學(xué)生察覺,在平時(shí)教學(xué)中,我們發(fā)現(xiàn)學(xué)生寫出SQL語(yǔ)句在上機(jī)實(shí)驗(yàn)通過后,并不仔細(xì)檢查對(duì)照檢索數(shù)據(jù)的正確與否,
例如,實(shí)驗(yàn)任務(wù):“請(qǐng)?jiān)趐ubs庫(kù)的employee表中查詢出1990年7月1日到12月31日(hire_date)雇傭的新員工的員工編號(hào)(emp_id),名字(fname),工作編號(hào)(job_id),列名為括號(hào)中的英文名”
學(xué)生可能會(huì)寫出如下語(yǔ)句:
select emp_id, fname, job_id from employee where hire_date between '1990-7-1' and '1990-12-31'
select emp_id, fname, job_id from employee where hire_date >'1990-7-1' and hire_date<'1990-12-31'
select emp_id, fname, job_id from employee where hire_date >'1990-7-1' and hire_date<='1990-12-31'
select emp_id, fname, job_id from employee where hire_date>='1990-7-1' and hire_date<='1990-12-31'
select emp_id, fname, job_id from employee where hire_date>'1990-6-30' and hire_date<='1990-12-31'
上面列舉的這些語(yǔ)句都是合法的SQL語(yǔ)句,但檢索的數(shù)據(jù)結(jié)果顯然不同。所以本實(shí)驗(yàn)平臺(tái)既要保證這些語(yǔ)句都可以正確執(zhí)行,同時(shí)還要指出這些語(yǔ)句的執(zhí)行結(jié)果與標(biāo)準(zhǔn)結(jié)果的差異。
這樣開放地對(duì)同一問題允許學(xué)生用不同的查詢語(yǔ)句實(shí)現(xiàn)有利于提高學(xué)生的問題解決能力,但同時(shí)也給系統(tǒng)對(duì)邏輯錯(cuò)誤的判定帶來(lái)了挑戰(zhàn)。
對(duì)于可執(zhí)行的SQL語(yǔ)句的邏輯錯(cuò)誤,我們的總體思路就是利用DataReader從數(shù)據(jù)庫(kù)提取學(xué)生實(shí)驗(yàn)語(yǔ)句的查詢結(jié)果集,然后和標(biāo)準(zhǔn)實(shí)驗(yàn)語(yǔ)句的查詢結(jié)果集進(jìn)行比較。在這里需要說(shuō)明的是,標(biāo)準(zhǔn)實(shí)驗(yàn)語(yǔ)句在實(shí)驗(yàn)任務(wù)出示的同時(shí)就已讀入到系統(tǒng)中,在學(xué)生提交自己實(shí)驗(yàn)語(yǔ)句的同時(shí)一并提交到服務(wù)器端執(zhí)行。
由于當(dāng)DataReader打開時(shí),該DataReader將以獨(dú)占方式使用Connection,在DataReader關(guān)閉之前,將無(wú)法對(duì)Connection執(zhí)行任何命令。而這里我們要在數(shù)據(jù)提取時(shí)返回兩個(gè)結(jié)果集,所以用到了DataReader提供的NextResult方法來(lái)順序循環(huán)訪問這些結(jié)果集,使用一個(gè)DataReader執(zhí)行兩條SQL語(yǔ)句。訪問到這些結(jié)果集后轉(zhuǎn)存到兩個(gè)矩陣中,然后利用這兩個(gè)矩陣進(jìn)行結(jié)果集的比較,進(jìn)而給出學(xué)生邏輯錯(cuò)誤提示,對(duì)不一致的數(shù)據(jù)進(jìn)行特效顯示,給學(xué)生更直觀的感受。
主要代碼如下:
//連接數(shù)據(jù)庫(kù)、打開連接代碼省略
SqlCommand mycomm=newSqlCommand(exsql+";"+stsql,myconn);
SqlDataReader myreader;
myreader=mycomm.ExecuteReader(); //生成查詢結(jié)果集
int flag=1;//標(biāo)志是第幾個(gè)查詢結(jié)果集
do
{
int n=1; //行數(shù)
int i=myreader.FieldCount; //列數(shù)
while(myreader.Read())
{
if(flag==1)
{
for(int t=0;t
exresult[0,t]=myreader.GetName(t).ToString().Trim();//存儲(chǔ)字段名
for(int m=0;m
{
exresult[n,m]=myreader[m].ToString().Trim();//存儲(chǔ)記錄
}
}
if(flag==2)
{//省略存儲(chǔ)第二個(gè)查詢結(jié)果集的代碼,同上}
n++;
}
flag=2;
}while(myreader.NextResult());//遍歷兩個(gè)結(jié)果集,轉(zhuǎn)存到相應(yīng)的矩陣
……//由于篇幅關(guān)系,此處省略兩個(gè)結(jié)果矩陣的比較部分。
在上文的例子中,輸入“select emp_id, fname, job_id from employee where hire_date >'1990-7-1' and hire_date<'1990-12-31'”有如圖3的執(zhí)行結(jié)果,可以看出執(zhí)行結(jié)果不但給出實(shí)驗(yàn)結(jié)果的正確率為0.4,而且可以讓學(xué)生明顯地看到查詢結(jié)果少了3組數(shù)據(jù)。
三 結(jié)束語(yǔ)
在線實(shí)驗(yàn)的優(yōu)勢(shì)是明顯的,學(xué)生可以不受時(shí)間和空間的限制利用網(wǎng)絡(luò)進(jìn)行自主學(xué)習(xí)。本文基于建構(gòu)主義學(xué)習(xí)理論,利用在線實(shí)驗(yàn)設(shè)計(jì)和實(shí)現(xiàn)了SQL語(yǔ)言的智能教學(xué)系統(tǒng),為學(xué)生提供一個(gè)具有情景性、協(xié)作性、自主性和適應(yīng)性的學(xué)習(xí)環(huán)境,大大提高了學(xué)生學(xué)習(xí)的質(zhì)量與效率。在實(shí)踐中我們將2006級(jí)254名學(xué)生隨機(jī)分為兩組,實(shí)驗(yàn)組158名學(xué)生采用SQLTutor實(shí)驗(yàn)教學(xué)環(huán)境;對(duì)照組的96名學(xué)生則采用真實(shí)上機(jī)實(shí)驗(yàn)環(huán)境,在學(xué)習(xí)時(shí)間等同的情況下,對(duì)于4份測(cè)試,實(shí)驗(yàn)組學(xué)生平均成績(jī)比對(duì)照組高出14.8%。在以后的工作中,我們將開展學(xué)生在線實(shí)驗(yàn)記錄與學(xué)業(yè)成績(jī)?cè)u(píng)定的可靠性研究。