彭 莉
(武漢工程職業(yè)技術(shù)學(xué)院 湖北 武漢:430080)
隨著計(jì)算機(jī)的普及,越來越多的企業(yè)和學(xué)校等部門開始使用信息管理系統(tǒng)來進(jìn)行辦公。學(xué)生考勤系統(tǒng)采用C/S(客戶端/服務(wù)器)模式,以C#為前臺應(yīng)用程序,SQL Server作為后臺數(shù)據(jù)庫。在數(shù)據(jù)庫中,使用存儲過程不僅可以增強(qiáng)系統(tǒng)安全性,還可以提高系統(tǒng)的運(yùn)行效率。
存儲過程是一組完成特定功能的T-SQL語句和流程控制語句的預(yù)編譯集合。它可以接收參數(shù)、輸出參數(shù)、返回值或者返回單個或多個結(jié)果集。存儲過程是一種數(shù)據(jù)庫對象,獨(dú)立的存儲在數(shù)據(jù)庫中,一般通過存儲過程名進(jìn)行調(diào)用。
存儲過程與存儲在客戶端的本地T-SQL語句相比,有以下四個優(yōu)點(diǎn):
(1)模塊化程序設(shè)計(jì)。每個存儲過程都是一個模塊,用于完成某一特定功能。存儲過程創(chuàng)建好后,以后可以通過存儲過程名反復(fù)調(diào)用,類似于C語言中的函數(shù)。另外,設(shè)計(jì)人員可獨(dú)立于應(yīng)用程序而對存儲過程單獨(dú)進(jìn)行修改,可移植性高。
(2)執(zhí)行效率高。如果某操作包含大量的T-SQL語句并且被反復(fù)執(zhí)行,那么存儲過程比T-SQL語句執(zhí)行速度要快。因?yàn)榇鎯^程是預(yù)編譯的,系統(tǒng)在首次執(zhí)行該存儲過程時會對它進(jìn)行分析和優(yōu)化,并將其保存在高速緩沖存儲器中;而T-SQL語句是從客戶端發(fā)送的,每次執(zhí)行時都要進(jìn)行預(yù)編譯和優(yōu)化,因此速度比較慢。
(3)減少網(wǎng)絡(luò)通信量。執(zhí)行一個由成百條T-SQL語句組成的命令時,需要重復(fù)發(fā)送成百條T-SQL語句;而執(zhí)行存儲過程只需要從客戶端發(fā)送一條執(zhí)行語句,從而減少了網(wǎng)絡(luò)通信量。
(4)更好的安全機(jī)制??梢詫Υ鎯^程授權(quán),實(shí)現(xiàn)對部分?jǐn)?shù)據(jù)的保密性。未授權(quán)的用戶將不能訪問數(shù)據(jù),從而保障了數(shù)據(jù)的安全性。
創(chuàng)建存儲過程的語法如下:
create proc[edure]存儲過程名[;分組號][{@參數(shù) 數(shù)據(jù)類型}[varying][=默認(rèn)值][out| output]][,…n]
[with {recompile| encryption}]
[for replication]
As
SQL查詢語句[,…n]
本系統(tǒng)中與考勤相關(guān)的表有三個,Kqin(考勤信息表)、KqinType(考勤類型表)和KqinJiLu(考勤時間設(shè)置表)。具體表結(jié)構(gòu)見表1-3。
表1 Kqin(考勤信息表)
表2 KqinType(考勤類型表)
表3 KqinJiLu(考勤時間設(shè)置表)
學(xué)生考勤存儲過程的功能是獲得學(xué)生的考勤說明信息。此考勤說明信息主要分為三種情況:(1)正常出勤;(2)如果遲到,并且是第一節(jié)課,顯示遲到多少分鐘;(3)如果遲到,并且不是第一節(jié)課,顯示曠課多少節(jié),遲到多少分鐘。其中,遲到時間是通過當(dāng)前時間與每節(jié)課開始時間之差獲得;曠課節(jié)數(shù)是通過流程控制語句中的選擇結(jié)構(gòu)進(jìn)行判斷得到。創(chuàng)建該存儲過程的源代碼如下:
create proc proc_Kqin /*創(chuàng)建存儲過程*/
@stuId int, /*接收學(xué)生編號參數(shù)*/
@remark varchar(20) output /*輸出考勤說明*/
as
declare @ks int /*聲明變量ks,表示上的是哪節(jié)課*/
declare @time char(6) /*聲明變量time,表示遲到的時間,以分鐘為單位*/
select @ks = dName, @time = Convert(char,DATEDIFF(mi, SUBSTRING(Convert(varchar,dStart,120),11,6), SUBSTRING(Convert(varchar,getdate(),120),11,6))) from KqinJilu where SUBSTRING(Convert(varchar,getdate(),120),11,6) between SUBSTRING(Convert(varchar,dStart,120),11,6) and SUBSTRING(Convert(varchar,dStop,120),11,6)
/*@time是當(dāng)前時間與每節(jié)課開始時間之間的時間差/*
/*SUBSTRING(Convert(varchar,getdate(),120),11,6)獲得當(dāng)前時間,只包括時分,不含年月日*/
/*SUBSTRING(Convert(varchar,dStart,120),11,6)表示上課時間*/
/*SUBSTRING(Convert(varchar,dStop,120),11,6)表示下課時間*/
declare @min int /*聲明變量min,表示第一節(jié)課*/
declare @max int /*聲明變量max,表示最后一節(jié)課*/
select @min = min(dId) from KqinJilu
select @max = max(dId) from KqinJilu
if @ks = 0 /*如果是第一節(jié)課*/
begin
set @remark = '遲到'+ @time +'分鐘'/*考勤說明格式為遲到多少分鐘*/
insert into Kqin values (@stuId,getdate(),100,@remark,'')
/*在Kqin表中插入學(xué)生遲到的考勤說明信息*/
end
else if @ks between 1 and 10 /*如果不是第一節(jié)課*/
begin
set @remark = '曠課'+Convert(char(2),@ks,120)+'節(jié),遲到'+Convert(char(2),@time,120)+'分鐘' /*考勤說明的格式為曠課多少節(jié),遲到多少分鐘*/
insert into Kqin values (@stuId,getdate(),101,@remark,'')
/*在Kqin表中插入學(xué)生曠課以及遲到的考勤說明信息*/
end
go
存儲過程在學(xué)生考勤系統(tǒng)中的使用,提高了系統(tǒng)的執(zhí)行效率。信息管理系統(tǒng)的安全高效運(yùn)行一直是廣大開發(fā)人員思考的問題,如何有效的利用存儲過程仍將是大家努力的方向。
[1] 胡吉林,姜波,高丙朋.存儲過程在ASP.NET數(shù)據(jù)庫系統(tǒng)開發(fā)中的應(yīng)用[J].微型電腦應(yīng)用,2008,24(9):51-53.
[2] 白會肖.存儲過程在.NET Web程序中的應(yīng)用——以“權(quán)限管理系統(tǒng)”的劃分權(quán)限模塊為例[J].石家莊職業(yè)技術(shù)學(xué)院學(xué)報(bào),2012,24(2):61-63.
[3] 賀憲春.SQLSERVER視圖和存儲過程在進(jìn)銷存系統(tǒng)開發(fā)中的應(yīng)用——以.NET開發(fā)環(huán)境實(shí)現(xiàn)統(tǒng)計(jì)業(yè)績提成為例[J].計(jì)算機(jī)光盤軟件與應(yīng)用,2013(1):4-6.
[4] 吳伶琳.存儲過程在網(wǎng)上商城系統(tǒng)開發(fā)中的應(yīng)用[J].計(jì)算機(jī)時代,2013(9):31-33.
[5] 耿濤,黃磊,劉儒香.SQLServer2005存儲過程在學(xué)生上機(jī)計(jì)費(fèi)管理系統(tǒng)中的應(yīng)用[J].西昌學(xué)院學(xué)報(bào)(自然科學(xué)版),2013,27(2):56-58.