摘要:該文闡述了存儲(chǔ)過程在科研管理系統(tǒng)中的應(yīng)用,簡(jiǎn)單介紹了科研管理系統(tǒng)的功能模塊、存儲(chǔ)過程的優(yōu)點(diǎn)、存儲(chǔ)過程的創(chuàng)建。
關(guān)鍵詞:數(shù)據(jù)庫(kù);存儲(chǔ)過程;科研管理系統(tǒng)
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2012)02-0464-03
Discussion on the Stored Procedure in the Application of Scientific Research Management System
LI Qiong-han
(Hainan College of Software Technology ,Qionghai 571400, China)
Abstract: This paper expounds the stored procedure in the scientific research management system application, introduces the scientific re? search management system function module, storage process advantages and create procedure.
Key words: database; storage process; scientific research management system
1概述
在各種系統(tǒng)開發(fā)中,使用存儲(chǔ)過程是一個(gè)良好的習(xí)慣,不僅可以帶來臨時(shí)表、函數(shù)、游標(biāo)等特性,而且調(diào)試、升級(jí)、維護(hù)都變得方便。在存儲(chǔ)過程中能夠把數(shù)據(jù)經(jīng)過處理再返回,這樣能夠?qū)?shù)據(jù)提供更多的分析和控制。。存儲(chǔ)過程是數(shù)據(jù)庫(kù)中的一個(gè)重要對(duì)象,任何一個(gè)設(shè)計(jì)良好的數(shù)據(jù)庫(kù)應(yīng)用程序都應(yīng)該用到存儲(chǔ)過程。
2存儲(chǔ)過程的優(yōu)點(diǎn)
2.1開發(fā)效率高
端代碼量很少,基本上是將客戶端的數(shù)據(jù),原原本本傳入到存儲(chǔ)過程。所有的計(jì)算都在存儲(chǔ)過程里完成,開發(fā)調(diào)試方便。存儲(chǔ)過程只在創(chuàng)造時(shí)進(jìn)行編譯,以后每次執(zhí)行存儲(chǔ)過程都不需再重新編譯,而一般SQL語(yǔ)句每執(zhí)行一次就編譯一次,所以使用存儲(chǔ)過程可提高數(shù)據(jù)庫(kù)執(zhí)行速度。
2.2維護(hù)方便
一般后臺(tái)有什么錯(cuò)誤,都在存儲(chǔ)過程里,修改完了不需要重啟服務(wù),基本不會(huì)干擾客戶運(yùn)營(yíng).當(dāng)對(duì)數(shù)據(jù)庫(kù)進(jìn)行復(fù)雜操作時(shí)(如對(duì)多個(gè)表進(jìn)行Update,Insert,Query,Delete時(shí)),可將此復(fù)雜操作用存儲(chǔ)過程封裝起來與數(shù)據(jù)庫(kù)提供的事務(wù)處理結(jié)合一起使用。
2.3安全性高
一個(gè)用戶可能沒有執(zhí)行存儲(chǔ)過程中語(yǔ)句的權(quán)限,但是可以被賦予執(zhí)行存儲(chǔ)過程的權(quán)限,這就增強(qiáng)了數(shù)據(jù)庫(kù)的安全性。另外,可以通過存儲(chǔ)過程來隱藏用戶可用的數(shù)據(jù)和數(shù)據(jù)操作中涉及的商業(yè)規(guī)則,提高了數(shù)據(jù)安全級(jí)別。相對(duì)于直接使用SQL語(yǔ)句,在應(yīng)用程序中直接調(diào)用存儲(chǔ)過程有以下好處:
2.3.1減少網(wǎng)絡(luò)通信量
調(diào)用一個(gè)行數(shù)不多的存儲(chǔ)過程與直接調(diào)用SQL語(yǔ)句的網(wǎng)絡(luò)通信量可能不會(huì)有很大的差別,可是如果存儲(chǔ)過程包含上百行SQL語(yǔ)句,那么其性能絕對(duì)比一條一條的調(diào)用SQL語(yǔ)句要高得多。
2.3.2執(zhí)行速度更快
有兩個(gè)原因:首先,在存儲(chǔ)過程創(chuàng)建的時(shí)候,數(shù)據(jù)庫(kù)已經(jīng)對(duì)其進(jìn)行了一次解析和優(yōu)化。其次,存儲(chǔ)過程一旦執(zhí)行,在內(nèi)存中就會(huì)保留一份這個(gè)存儲(chǔ)過程,這樣下次再執(zhí)行同樣的存儲(chǔ)過程時(shí),可以從內(nèi)存中直接調(diào)用。
2.3.3更強(qiáng)的適應(yīng)性
由于存儲(chǔ)過程對(duì)數(shù)據(jù)庫(kù)的訪問是通過存儲(chǔ)過程來進(jìn)行的,因此數(shù)據(jù)庫(kù)開發(fā)人員可以在不改動(dòng)存儲(chǔ)過程接口的情況下對(duì)數(shù)據(jù)庫(kù)進(jìn)行任何改動(dòng),而這些改動(dòng)不會(huì)對(duì)應(yīng)用程序造成影響。
2.3.4分布式工作
應(yīng)用程序和數(shù)據(jù)庫(kù)的編碼工作可以分別獨(dú)立進(jìn)行,而不會(huì)相互壓制。
科研項(xiàng)目申報(bào)模塊:教師個(gè)人登錄后,可上傳項(xiàng)目申報(bào)書,查看項(xiàng)目審批狀態(tài),修改個(gè)人登錄密碼,申報(bào)者可以查看是否通過。
科研數(shù)據(jù)錄入模塊:教師個(gè)人科研信息的錄入,其中科研信息主要包括論文.項(xiàng)目,獲獎(jiǎng)、教材專著和課題等。
科研數(shù)據(jù)管理模塊:教師個(gè)人科研信息的修改、刪除。
科研項(xiàng)目審核模塊::管理員對(duì)教師申報(bào)的科研項(xiàng)目進(jìn)行審核、審批。
查詢、統(tǒng)計(jì)和報(bào)表打印模塊:對(duì)各種科研信息進(jìn)行統(tǒng)計(jì)和報(bào)表的打印,包括對(duì)教師個(gè)人發(fā)表的科研論文、著作、獲獎(jiǎng)、本年度批準(zhǔn)的科研項(xiàng)目情況統(tǒng)計(jì)和打印。
角色管理:主要實(shí)現(xiàn)系統(tǒng)的安全管理。包括添加用戶,用戶管理等.以實(shí)現(xiàn)對(duì)用戶和用戶角色的管理。角色管理是專為具有系統(tǒng)管理員權(quán)限的用戶設(shè)計(jì)的。系統(tǒng)在數(shù)據(jù)庫(kù)中首先設(shè)置一個(gè)或多個(gè)具有管理員權(quán)限的用戶,通過用戶登錄來判斷用戶的權(quán)限,若為管理員則可進(jìn)入該模塊,實(shí)現(xiàn)對(duì)整個(gè)科研數(shù)據(jù)庫(kù)的維護(hù)與管理(包括增加、修改、刪除等多項(xiàng)操作)。
基本設(shè)置模塊:主要包括年度、科研類別、研究類別、獲獎(jiǎng)?lì)悇e、部門等一些基本信息的添加。
圖1
圖2
4創(chuàng)建存儲(chǔ)過程
下面以論文表為例,介紹存儲(chǔ)過程在科研管理系統(tǒng)中的應(yīng)用。
圖2所示是論文表的字段構(gòu)成。
--論文存儲(chǔ)過程(包含插入論文與修改論文)
createproc [dbo].[proc_lunwen]
@lwidint integer=null, --論文id
@lwname varchar(150),--論文名稱
@dywriter varchar(20),--第一作者
@qtwriter varchar(200),--其他作者
@lwjibie varchar(20),--級(jí)別
@xkkind varchar(30),--學(xué)科分類
@fbtime datetime ,--發(fā)表時(shí)間
@wnumber varchar(20),--字?jǐn)?shù)
@kwIssn varchar(100),--刊物編號(hào)
@kwcn varchar(100),--國(guó)內(nèi)編號(hào)
@kwname varchar(100),--刊物名稱
@issue varchar(100),--期號(hào)(發(fā)表時(shí)間期數(shù))
@kyzheid int,
@zhubdw varchar(100),--主辦單位
@beizhu varchar(500)--備注
as
if isnull(@lwidint,0)=0 --插入記錄
begin
insert lunwen(lwname,dywriter,qtwriter,lwjibie,xkkind,fbtime,wnumber,kwIssn,kwcn,kwname,issue,kyzheid,zhubdw,beizhu) values(@lw? name,@dywriter,@qtwriter,@lwjibie,@xkkind,@fbtime,@wnumber,@kwIssn,@kwcn,@kwname,@issue,@kyzheid,@zhubdw,@beizhu)
end
else--修改記錄
begin
update lunwen
set lwname=@lwname,
dywriter=@dywriter,
qtwriter=@qtwriter,
lwjibie=@lwjibie,
xkkind=@xkkind,
fbtime=@fbtime,
wnumber=@wnumber,
kwIssn=@kwIssn,
kwcn=@kwcn,
kwname=@kwname,
issue=@issue,
zhubdw=@zhubdw,
beizhu=@beizhu
where lwidint=@lwidint
end
--統(tǒng)計(jì)論文存儲(chǔ)過程
create proc [dbo].[tjlw] @dt1 varchar(20) ,@dt2 varchar(20)
as
create table #lw(
lwid int identity(1,1),
dywriter varchar(20) null,
qtwriter varchar(200) null,
fbtime datetime null,
lwname varchar(150) null,
kwname varchar(150) null,
kwissn varchar(100) null,
kwcn varchar(100) null,
issue varchar(100) null,
kyzheid int null,
beizhu varchar(500) null
)
create table #kyzhe(
kyid int identity(1,1),
kyzheid int null,
bmname varchar(20) null
)
create table #lwtj_temp(
lw_tid int identity(1,1),
dywriter varchar(20) null,
qtwriter varchar(200) null,
fbtime datetime null,
lwname varchar(150) null,
kwname varchar(150) null,
kwissn varchar(100) null,
kwcn varchar(100) null,
issue varchar(100) null,
kyzheid int null,
bmname varchar(20) null,
beizhu varchar(500) null
)
create table #lwtj(
id int identity(1,1),
writer varchar(200) null,--dywriter、qtwriter姓名
lwname varchar(150) null,--成果名稱
fbtime datetime null,
chenggly varchar(200) null, --kwname、kwissn、kwcn成果來源
issue varchar(100) null,--發(fā)表時(shí)間
kyzheid int null,
bmname varchar(20) null,--系部
beizhu varchar(500) null
)
insert into #lw select dywriter ,qtwriter,fbtime,lwname,kwname,kwissn ,kwcn ,issue ,kyzheid ,beizhu from lunwen
insert into #kyzhe select kyzheid,bmname from kyzhe
declare @row int,
@i int,
@dywriter varchar(20),@qtwriter varchar(200),@fbtime datetime,@lwname varchar(150),@kwname varchar(100),@kwissn varchar(100),@kwcn varchar(100),@writer varchar(200),@chenggly varchar(200),
@issue varchar(100),@kyzheid int,@bmname varchar(20),@beizhu varchar(500)(下轉(zhuǎn)第468頁(yè))
(上接第466頁(yè))
set @i=1
insert into #lwtj_temp select dywriter,qtwriter,fbtime,lwname,kwname,kwissn,kwcn,issue,#lw.kyzheid,bmname,beizhu from #lw join #ky? zhe on #lw.kyzheid=#kyzhe.kyzheid
set @row=@@rowcount
while @i<=@row
begin
--print i=+convert(varchar,@i)
select@dywriter=dywriter,@qtwriter=qtwriter,@fbtime=fbtime,@lwname=lwname,@kwname=kwname,@kwissn=kwissn,@kwcn=kwcn,@issue=issue,@kyzheid=kyzheid,@bmname=bmname,@beizhu=beizhu from #lwtj_temp where lw_tid=@i
set @writer=@dywriter+、+@qtwriter
set @chenggly=@kwname+、+@kwissn+、+@kwcn
insert into #lwtj select @writer,@lwname,@fbtime,@chenggly,@issue,@kyzheid,@bmname,@beizhu
set @i=@i+1
end
select * from #lwtj where fbtime>=@dt1 and fbtime<=@dt2
創(chuàng)建以上存儲(chǔ)過程后,保存之。保存完畢,與該存儲(chǔ)過程相對(duì)應(yīng)的節(jié)點(diǎn)就會(huì)出現(xiàn)在服務(wù)器資源管理器中。同時(shí)請(qǐng)注意代碼編輯窗口中的CREATE關(guān)鍵字變?yōu)锳LTER關(guān)鍵字了,該關(guān)鍵字是用于更改任何現(xiàn)有的存儲(chǔ)過程的。要運(yùn)行上述存儲(chǔ)過程,只要點(diǎn)擊其節(jié)點(diǎn)并在右鍵彈出菜單中選擇“運(yùn)行存儲(chǔ)過程”。
5結(jié)束語(yǔ)
設(shè)計(jì)具有高可靠性、高響應(yīng)速度的軟件系統(tǒng)是一件很難的事情。從數(shù)據(jù)庫(kù)設(shè)計(jì)、系統(tǒng)的架構(gòu)設(shè)計(jì)到存儲(chǔ)過程設(shè)計(jì)和代碼的編寫,每個(gè)環(huán)節(jié)都息息相關(guān)。在設(shè)計(jì)過程中充分地考慮存儲(chǔ)過程的應(yīng)用,會(huì)給軟件設(shè)計(jì)帶來極大的便利,從而大大提高設(shè)計(jì)效率。
參考文獻(xiàn):
[1]李瓊漢,周恩.基于ASP.NET AJAX的高??蒲泄芾硐到y(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2011,7(2).
[2]【美】Sanjeev Rohilla. ADO.NET專業(yè)項(xiàng)目實(shí)例開發(fā)[M].陳君,王寶良,譯.北京:中國(guó)水利水電出版社2003.