【机房重构】——存储过程
来源:互联网 发布:网络通信是做什么的 编辑:程序博客网 时间: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
- 机房重构——存储过程
- 机房重构——存储过程
- 【机房重构】——存储过程
- 【机房重构】——存储过程
- 机房重构——存储过程
- 【机房重构】——存储过程
- 【机房重构】——存储过程
- 机房重构—存储过程
- 存储过程中使用事务——机房重构
- 机房重构(3)——存储过程
- 【机房重构】——存储过程和触发器
- 【机房重构】——存储过程遇到的问题
- 【机房重构】——存储过程+事务
- 机房重构——存储过程详解
- 个人机房重构——存储过程
- 【机房重构】——存储过程(Stored Procedure)
- 【机房重构】——存储过程的运用
- 重构个人版机房收费系统—存储过程
- BZOJ-3668 起床困难综合症 位运算+贪心
- less初学2:嵌套规则,@arguments,避免编译,!important
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- Android px、dp、sp之间相互转换
- MonkeyRunner实例讲解
- 【机房重构】——存储过程
- OC修改单个文件的函数
- matlab中将命令设置成变量之后怎么恢复
- Hibernate 缓存机制详解
- APK使用bzip2、bsdiff实现增量升级
- Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
- Ubuntu14.04 LTS安装QQ8.1
- 求最小公倍数的方法
- android getContext()、getApplicationContext()和this有什么区别