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