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