摘 要: 利用SQL Server作為數(shù)據(jù)庫管理平臺開發(fā)高校通用計算機在線考試軟件系統(tǒng)時,,由于數(shù)據(jù)量較大,最應關注的是軟件系統(tǒng)的運行速度,、性能和可維護性等指標,。如果采用常規(guī)的程序設計方案,會造成網(wǎng)絡通信數(shù)據(jù)量大,、業(yè)務邏輯處理速度慢,、系統(tǒng)運行效率低等問題,。為解決這些問題,軟件系統(tǒng)中相關業(yè)務邏輯設計采用存儲過程的方法實現(xiàn),大大減少了網(wǎng)絡流量,提高了系統(tǒng)的性能和可維護性,。
關鍵詞: SQL Server; 在線考試; 網(wǎng)絡流量; 存儲過程
隨著計算機網(wǎng)絡技術和數(shù)據(jù)庫技術的飛速發(fā)展,,高校的數(shù)字化校園建設進程日益深入,其中數(shù)字化教學與學習環(huán)境建設成為其核心內(nèi)容,。為推動數(shù)字化校園建設進程,,創(chuàng)建數(shù)字化教學環(huán)境,利用Delphi7和SQL Server2000開發(fā)出適用于多學科的高校通用計算機在線考試軟件系統(tǒng)。Delphi在基于C/S模式的數(shù)據(jù)庫應用開發(fā)領域具有很強的數(shù)據(jù)庫支持能力,,因為它提供了豐富的數(shù)據(jù)庫操作組件,,常用的有TQuery、TTable,、TADOQuery和TADOTable等[1],。通過這些組件,程序員可以在短時間內(nèi)完成一個應用程序模塊的設計,,大大減少了開發(fā)人員的工作量,。但是,這些組件在操作數(shù)據(jù)庫時卻存在局限性,,即必須將數(shù)據(jù)庫中的記錄從服務器端取出放入到客戶端,,再根據(jù)查詢條件進行選擇。這種實現(xiàn)方法,,如果待訪問的數(shù)據(jù)量較大,,勢必因為查詢時間較長而降低程序執(zhí)行的速度,從而降低應用程序的性能,。解決這一問題利用了SQL Server2000的存儲過程來實現(xiàn)[2],。
1 存儲過程及其優(yōu)點
1.1 存儲過程的定義
存儲過程是存儲在服務器上的一組預先定義并編譯好的用來實現(xiàn)某種特定功能的SQL語句。它可以接受參數(shù),、返回狀態(tài)值或參數(shù)值,。存儲過程在服務器端執(zhí)行,通過應用程序調(diào)用的方法實現(xiàn),,執(zhí)行結束后再把結果返回到客戶端,。
1.2 存儲過程的優(yōu)點
(1)存儲過程執(zhí)行速度快,便于提高系統(tǒng)的性能,。由于存儲過程在第一次執(zhí)行之后,,其執(zhí)行規(guī)劃就儲存在高速緩沖存儲區(qū)中,在以后的操作中,。只需從高速緩沖存儲區(qū)中調(diào)用編譯好的二進制形式存儲過程來執(zhí)行[3],。
(2)減少網(wǎng)絡流量,提高系統(tǒng)執(zhí)行效率,??蛻舳藨贸绦蛘{(diào)用一個存儲過程,,只需通過網(wǎng)絡發(fā)送該過程名和少量入口參數(shù),數(shù)據(jù)庫服務器就可執(zhí)行該過程,,執(zhí)行完成后,,只返回結果狀態(tài)或?qū)⒆罱K結果集給客戶端應用程序,無需通過網(wǎng)絡傳送大量的SQL操作命令和中間結果,,最大限度地減少網(wǎng)絡通信負擔,,提高了執(zhí)行效率。
(3)維護了數(shù)據(jù)庫的安全性,。如果用戶被授予執(zhí)行存儲過程的權限,,即使該用戶沒有在執(zhí)行該存儲過程中可參考的表或視圖的訪問權限,該用戶也可以完全執(zhí)行該存儲過程而不受影響,。因此,,可以通過創(chuàng)建存儲過程來完成數(shù)據(jù)的插入、更新和刪除等操作,,并且可以通過編程方式控制在操作中對信息的訪問權限[4],。
(4)提高軟件系統(tǒng)的可維護性。存儲過程在創(chuàng)建時就在服務器上經(jīng)過調(diào)試和編譯,,可以避免不必要的錯誤出現(xiàn),。另外,,存儲過程將相關業(yè)務邏輯封裝在一起,,可以大大提高整個軟件系統(tǒng)的可維護性。因為當相關業(yè)務邏輯發(fā)生變化時,,不需要修改并編譯客戶端應用程序,,只需要修改位于服務器端的實現(xiàn)相應業(yè)務邏輯的存儲過程即可。
(5)充分增強SQL語言的功能和靈活性,。存儲過程可以用流控制語句編寫,,有很強的靈活性,可以完成復雜的判斷和運算,。
基于以上優(yōu)點,,在進行C/S模式數(shù)據(jù)庫應用系統(tǒng)開發(fā)時,通常把比較浪費時間,、影響網(wǎng)絡傳送的相關業(yè)務邏輯編寫成存儲過程由服務器執(zhí)行,,同時利用服務器的SQL語法進行優(yōu)化處理,只將少量的結果顯示在客戶端,,充分提高軟件系統(tǒng)的性能[5],。
2 存儲過程的創(chuàng)建方法
以SQL Server 2000數(shù)據(jù)庫管理系統(tǒng)為背景,創(chuàng)建方法如下:
CREATE PROC[EDURE]
procedure_name[;number]
[{@parameter data_type}[VARYING][=default] [OUTPUT] ][,...n]
[WITH {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}]
[FOR REPLICATION]
AS sql_statement [...n ]
下面對語法中各選項進行說明:
(1)選項“procedure_name”指存儲過程名,,不能超過128個字符,,“[;number]”指程序編號,,用于區(qū)別同名的存儲過程。
(2)選項“@parameter”表示參數(shù),,每個存儲過程中最多可以設定1 024個參數(shù),,要求在每個參數(shù)名前加上符號“@”。
(3)選項“[=default]”指為對應參數(shù)設定默認值,。
(4)選項“OUTPUT”用來指定參數(shù)既有輸入又有輸出,。即在調(diào)用這個存儲過程時,如果所指定的參數(shù)是要輸入的參數(shù),,同時也需要在結果中輸出,,則該項必須為“OUTPUT”。
(5)選項“WITH”用來指定存儲過程的處理方式,。
(6)選項“FOR REPLICATION”表示只能由復制方式執(zhí)行[6],。
3 存儲過程在考試軟件系統(tǒng)中的應用
(1)考試系統(tǒng)在運行時要經(jīng)過三個步驟,考生抽取套題編號,、抽取套題內(nèi)容和將套題內(nèi)容插入答題表進行答題,。如果不采用存儲過程,則需用下面方法實現(xiàn),。
①隨機抽取套題編號
select 套題編號from tblcrecord order by newid()
②抽取對應套題內(nèi)容,套題編號存儲在dm.strNum中
with qry1 do
Begin
Close ;
SQL.Clear ;
SQL.Add(′Select * from tblTK Where 套題編號
='''+dm.strNum +''');
Open ;
End;
③插入考試題到考試表tblKS中
qry1.First;
While not qry1.Eof Do
begin
qry2.Append;
qry2.FieldByName(‘考生學號’).Value:= qry1.Field-
ByName(‘考生學號’).Value;
…
qry2.Post;
end;
顯然,,此種方法步驟繁瑣,耗時較多,,在考試過程中會產(chǎn)生抽題緩慢的現(xiàn)象,,系統(tǒng)性能嚴重降低。為避免此種情況的發(fā)生,,考試系統(tǒng)采用了存儲過程的方法,,代碼如下[7]:
CREATE PROCEDURE cp_Paper_Add
@MyNo char(10),
@Mynum char(20)
AS
set nocount on
exec(′insert into tblKS (學生學號、套題編號,、試題序號,、試題內(nèi)容、試題答案,、試題分數(shù),、是否答題、套題名稱,、考試科目,、試題類型、學生分數(shù),、類別序號) select''''+@MyNo+'''',''''+@Mynum+''',試題序號,試題內(nèi)容,試題答案,試題分數(shù),“否”,套題名稱,科目名稱,試題類型,0,類別序號 from tblTK where 套題編號='''+@Mynum+''' )
GO
通過執(zhí)行存儲過程,,將題庫中與考生抽取套題編號相匹配的記錄提取出來,并批量插入到考試表中,,同時對考生分數(shù)進行了初始化為0的動作,。而本考試系統(tǒng)就是將考生的學號和考生抽取的套題編號作為參數(shù)傳遞給存儲過程,,因此,大幅度提高了考試軟件的效率,。
(2)在考試系統(tǒng)進行不同類型題目抽取時,,如果在Delphi中直接應用SQL語句,應使用下面代碼:
with cds1 do
Begin
Close ;
SQL.Clear ;
SQL.Add(′Select * from tblKS Where 學生學號=′);
SQL.Add(‘ ?蓯+dm.strNo +?蓯 and 試題類型=′′單項選擇題′′ order by 試題序號′);
Open ;
End;
此時,,程序是在運行時才編譯的,。這樣就增加了運行的時間,同時還要把完整的SQL語句傳遞給Sql Server服務器執(zhí)行,,這樣考試過程中勢必增加網(wǎng)絡流量,,降低軟件的運行效率。
如果采用存儲過程,,可用下面方法實現(xiàn):
CREATE PROCEDURE sp_Query_All
@strNo char(10)
AS
set nocount on
Select Select * from tblKS Where 學生學號=@strNO and 試題類型=′′單項選擇題′′ order by 試題序號
GO
在客戶端調(diào)用方法如下:
with cds1 do
Begin
Close ;
SQL.Clear ;
SQL.Add('exec sp_Query_All :strNO');
Params.ParamByName('strNO').Value:=DM.strNO;
Open ;
End;
此時,,存儲過程是預先編譯的,自然節(jié)省了編譯的時間,,同時只向服務器傳遞了一個參數(shù)DM.strNO,,大大減少了網(wǎng)絡流量,提高了考試系統(tǒng)的性能,。
(3)在考試系統(tǒng)中添加考生信息時,,首先要判斷是否存在該考生學號信息,然后再進行添加操作,。如果采用普通SQL語句,,代碼如下:
with qry1 do
Begin
Close ;
SQL.Clear ;
SQL.Add(′select * from tblstudents where考生學號=
:strNO′);
Params.ParamByName('strNO').Value :=DM.strNO;
Open ;
if recordcount=0 then
begin
qry2.Append;
qry2.FieldByName(‘考生學號’).Value:= DM.strNO;
…
qry2.Post;
End;
采用存儲過程,可以用流控制語句編寫,。采用存儲過程代碼如下:
CREATE PROCEDURE sp_Stud_Add
@No char(10),
@Name char(20),
@Sex char(2),
@Class char(30),
@XueYuan char(20),
@XH smallint
AS
if not exists (Select * from tblStudents where 學生學號=
@No)
begin
insert into tblStudents values(@No,@Name,@Sex,@Class,
@XueYuan,@XH)
end
GO
通過if 流控制語句實現(xiàn)了相同學號不能插入的功能,,增強了SQL語言的功能和靈活性,,避免了普通SQL語句的繁瑣與低效,,提高了考試系統(tǒng)的性能。
在開發(fā)數(shù)據(jù)庫應用系統(tǒng)時,,合理使用存儲過程來完成相關的業(yè)務邏輯操作,,能夠顯著提高系統(tǒng)的性能、運行效率和可維護性,。當然,,并非所有的業(yè)務邏輯都要使用存儲過程來實現(xiàn)。如果都使用存儲過程的方法實現(xiàn),,一定會增加服務器的負擔,;同時,客戶端的資源也不能得到充分的利用[8],。因此,,要根據(jù)具體情況,,將那些使用頻繁、比較復雜的業(yè)務邏輯用存儲過程的方法實現(xiàn),,合理規(guī)劃服務器端和客戶端程序,,使相關事務能夠均衡處理,以此提高軟件系統(tǒng)的性能和效率,。
參考文獻
[1] 吳小林,,蔣先剛,高艷錦.基于Delphi的多層數(shù)據(jù)庫應用系統(tǒng)連接技術的研究[J].華東交通大學學報,,2005,,22(1):68-70.
[2] 史創(chuàng)明.SQL Server 2000中文版數(shù)據(jù)庫管理與應用標準教程[M].北京:清華大學出版社,2006:264-278.
[3] 張莉,,陳雷,,孫龍清,等.SQL Server數(shù)據(jù)庫原理及應用(第2版)[M]. 北京:清華大學出版社,2009:265-275.
[4] 李舒,,陳麗君.高校學生成績管理系統(tǒng)的設計與實現(xiàn)[J].遼寧大學學報.自然科學版,,2006,33(3):284-285.
[5] 曾毅,,王玉萍.SQL Server數(shù)據(jù)庫中存儲過程的實現(xiàn)[J].科技信息,,2008(25):88-89.
[6] 肖輝輝,段艷明.SQL Server 2000存儲過程在VB中的應用[J].福建電腦,,2007(12):189-190.
[7] 馬曉梅.SQL Server 2000實驗指導(第2版)[M].北京:清華大學出版社,,2008:105-112.
[8] 孫曉楓,范正翹,,袁海文.存儲過程在SQL Server數(shù)據(jù)庫自我管理中的高級應用[J].計算機應用,,2002,22(4):92-93.