上篇博客介绍了SQl视图的使用,这篇博客通过内容和实例应用来简单介绍一下存储过程。 在机房重构的过程中,犯了个大忌(数据库设计在重构过程被修改了),所以影响了一个功能的实现,就又重新敲了一下机房收费系统退卡功能。正如“塞翁失马,焉知非福”,纯三层的代码实现变成了利用存储过程之后的完美实现。期间的磕磕绊绊都让我们对存储过程加深了理解。
当需要写多条SQl语句的时候,就可以使用存储过程,在数据库中建立存储过程。之后在VS中通过调用存储过程来使用。
百度百科:存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
(来自百度)用的越多,越能体会它的好处,现在理解不是很深,只能借鉴网络的了。
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。 2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。 3.存储过程可以重复使用,可减少数据库开发人员的工作量 4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权
1. 使用之前,现在Sql Sever中通过T_SQL语句建立存储过程。如下图所示,右击【存储过程】,选择新建存储过程。
之后再出现的窗口中输入创建存储过程的代码,如下所示:
CREATE procedure [dbo].[proc_Cancelcard] --写存储过程的名字pro_Cancelcard --以下是定义的参数,也就是在使用此过程的时候,需要传进来值的参数。 @CardNo varchar(15), @CancelDate date, @CancelTime varchar(20), @Statue varchar(10), @CancelUserID varchar(10) as --声明的变量 declare @CancelCash numeric(18, 2), @StudentNo varchar(11) begin --给定义的变量直接进行赋值查询 select <span style="font-family:KaiTi_GB2312;color:#ff0000;">@CancelCash =Cash ,@StudentNo=StudentN</span>o from V_StudentInfo where CardNo =@CardNo --将传入的参数和已赋值的变量新插入记录到退卡表中 Insert into T_CancelCardInfo (StudentNo,CardNo,CancelCash,CancelDate,CancelTime,Statue,CancelUserID) values(@StudentNo,@CardNo,@CancelCash,@CancelDate,@CancelTime,@Statue,@CancelUserID) --更新了卡表中的状态Statue Update T_CardInfo set Statue ='已停用' end说明:如果你的存储过程中的SQl语句是第一条查询,第二条要使用查询结果的话,就不用定义参数直接定义变量进行赋值查询如红字所示。
2.在VS中调用存储过程
D层代码:
''' <summary> ''' 调用存储过程去插入,更新 ''' </summary> ''' <param name="enCancel"></param> ''' <param name="eninfo"></param> ''' <param name="enline"></param> ''' <returns>boolean型变量</returns> ''' <remarks></remarks> Public Function CancelCardDAL(ByVal enCancel As Entity.CancelCardEntity, ByVal eninfo As Entity.V_StudentEntity, ByVal enline As Entity.LineInfoEntity) As Boolean Dim helper As New SqlHelper '创建SQlhelper的对象 Dim flag As Boolean Dim sql As String = "proc_CancelCard" '创建的存储过程的名字 Dim params As SqlParameter() = {New SqlParameter("@CardNo", enCancel.CardNo), New SqlParameter("@CancelUserID", enCancel.CancelUserID), New SqlParameter("@Statue", enCancel.Statue), New SqlParameter("@CancelDate", enCancel.CancelDate), New SqlParameter("@CancelTime", enCancel.CancelTime)} flag = helper.ExecuteNonQuery(sql, CommandType.StoredProcedure, params) Return flag '返回boolean型 End Function
1.在用户输入卡号,应该先去查询是否存在此卡号,是否是正在上机的;
2.之后应该查询余额,学号(这个查询使用视图,不过后来改完数据库发现,这个视图可以不用,就当是练手实践了)和当前时间,用户等往退卡表中添加一条记录;
3.之后更新卡表中的卡的状态;
4.显示退卡信息,提示退卡成功。
因为之前纯三层的代码,和这版比较之下,直接显示了差别。代码多,调用关系乱,很考验人的大脑。存储过程一个顶多个SQL,何乐而不为呢?