【机房重构】——存储过程

来源:互联网 发布:网络通信是做什么的 编辑:程序博客网 时间:2024/05/21 21:38


前言


机房进行了有一段时间了,原以为有第一次的经验这次应该很容易,其实才发现我们第一次了解的只是一些皮毛,照猫画虎的敲了出来,离真正要出现在生产线上的产品还很远,需要加入存储过程、触发器、视图、设计模式等,不过正是因为第一次才有了后来的重构,学习就是一个过程,每个环节都缺一不可。


存储过程


概念
存储过程是放在服务器上的预先编译好的SQL语句,存储过程在第一次执行时进行语法检查和编译,编译好的存储过程在告诉缓存中用于后续调用,这样就可以使存储过程执行时更加迅速、高效。


优点
1.提供安全机制
2.改进了执行性能
3.减少了网络流量
4.增加了代码的重用性


实战例子


以注册为例子存储过程的应用


1.数据库——存储过程——右击新建存储过程




2.创建存储过程中内容


ALTER PROCEDURE [dbo].[proc_RegisterCard] --存储过程名称:proc_RegisterCard    --T_CardInfo、T_StudentInfo、T_RechargeInfo三张表中受影响的字段对应的参数    @CardNo int,    @Studentno int,    @StudentName char(12),    @Sex char(12),    @Department char(12),    @Grade char(12),    @ClassN char(12),    @Status char(12),    @Type char(12),    @Cash numeric(18,1),    @IsCheck char(12),        @RDate datetime,    @RTime time,    @UserID char(12)    ASBEGIN        --向T_CardInfo、T_StudentInfo、T_RechargeInfo三张表中插入数据    insert into T_CardInfo(CardNo,Cash,Status,IsCheck,RDate,RTime,Type,UserID) values(@CardNo,@Cash ,@Status,@IsCheck,@RDate,@RTime,@Type,@UserID )        insert into T_StudentInfo(StudentNo,StudentName,Sex,Department,Grade,Class,CardNo) values(@Studentno,@StudentName,@Sex,@Department,@Grade,@ClassN,@CardNo)      insert into T_RechargeInfo(CardNo,RechargeCash,RechargeDate,RechargeTime,UserID) values(@CardNo,@Cash ,@RDate ,@RTime ,@UserID )     END


3.加入事务保证数据一致


事务:构成单一逻辑工作单元的操作集合,要么完整地执行、要么完全执行。

性质:原子性、一致性、隔离性、持久性

加入事务后可以保证三个数据库里的数据全部改动或全部不动,保证数据一致。


BEGIN    declare @errorSun int --定义错误计数器    set @errorSun=0 --没错为0    begin transaction  --开始事务语句    --向T_CardInfo、T_StudentInfo、T_RechargeInfo三张表中插入数据    insert into T_CardInfo(CardNo,Cash,Status,IsCheck,RDate,RTime,Type,UserID) values(@CardNo,@Cash ,@Status,@IsCheck,@RDate,@RTime,@Type,@UserID )      set @errorSun =@errorSun +@@error --累计是否有错      insert into T_StudentInfo(StudentNo,StudentName,Sex,Department,Grade,Class,CardNo) values(@Studentno,@StudentName,@Sex,@Department,@Grade,@ClassN,@CardNo)      set @errorSun =@errorSun +@@error --累计是否有错    insert into T_RechargeInfo(CardNo,RechargeCash,RechargeDate,RechargeTime,UserID) values(@CardNo,@Cash ,@RDate ,@RTime ,@UserID )      set @errorSun =@errorSun +@@error --累计是否有错    IF @errorSun<>0       rollback transaction  --事务回退语句    ELSE       commit transaction    --事务提交语句END

4.返回存储过程中的表:以充值中需要返回T_CardInfo表中金额为例


BEGIN    --D层参数中没有但是需要用到的参数    declare     @Cash numeric(18,1),    @EndCash numeric(18,1)    --查询卡号是否存在并把卡表中cash字段赋给参数@Cash    select @Cash=cash from T_CardInfo where <a target=_blank href="mailto:CardNo=@CardNo">CardNo=@CardNo</a>    --返回表    exec('select*from T_CardInfo where <a target=_blank href="mailto:CardNo='+@CardNo+''">CardNo='+@CardNo+''</a>)    --插入到T_RechargeInfo    insert into T_RechargeInfo(CardNo,RechargeCash,RechargeDate,RechargeTime,UserID) values (@CardNo,@RechargeCash,@RechargeDate,@RechargeTime,@UserID )    --将充值金额+原来金额赋值给@EndCash    set @EndCash=@RechargeCash+@Cash     --更新T_CardInfo中的余额    update T_CardInfo set Cash=@EndCash where CardNo=@CardNoEND


注意:

因为七层中返回的是DataTable,所以需要把表返回给SQLHelper,在参数@CardNo前后都加+和'CardNo='+@CardNo+'


--返回表    exec('select*from T_CardInfo where <a target=_blank href="mailto:CardNo='+@CardNo+''">CardNo='+@CardNo+''</a>)


返回到U层后把DataTable中的第一行的第二个字段取出,定义一个CardCash来接受就可以了。

CardCash = CardSave.Rows(0)(2)




0 0