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