简单了解
- where from:
- 从哪来?SQL语句,存储过程是建立在SQL语句的基础上的。
- why / when / where to go:
- 为什么用? 涉及到多表操作的时候,D层的负担会很大,存储过程可以给D层减负。
- what:
- 是什么? SQL语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它存储过程是一堆SQL语句的集合。 其实就是为了实现对数据库某些操作的一堆SQL语句,编译之后可以在D层中调用。
- How:
- 怎么用,后面有下机实例展示。
- 全面看待
- 优点:
- 重复使用,提高性能,安全防注入
- 缺点:
- 调试不便,不利于重新编译,后期维护不便,没有解耦和
#对比触发器 - 相同点在于:
本质上都是SQL语句集,可以说触发器是特殊的存储过程。当用户执行某一特殊操作的时候,使数据库需要多处更新时,我们可以考虑采用触发器或者存储过程,给D层减负。 - 不同点
- 触发器是强制执行的,不需调用,只要满足了提前设定的触发条件,触发器便会自动执行设定操作。而存储过程是需要在程序中调用的。
- 触发器是通过事件执行出发而被执行的,比如说我们对表进行增删改操作时,SQL server会自动执行触发器定义的增删给语句,这便是最直观的触发操作。
下机实践
数据库中操作
创建方式有两种,SQL语句创建和手动创建。这个不解释不展示,大家自行脑补或查询。
-- =============================================
-- Author: <Hepburn Yang>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[Pro_Offline]
-- 用到的参数,以及参数类型
-- 备注:存储过程中声明的所有变量,都必须在D层中赋予一个初值。
@CardNo char(10),
@OffDate Date ,
@OffTime time(7),
@ConsumeTime numeric(18,1),
@ConsumeCash numeric(18,1),
@RemainCash numeric(18,1),
@IsCheck char(10)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
--更新line表
update T_Line set offDate =@OffDate ,offTime =@OffTime ,consumeTime =@ConsumeTime ,consumeCash =@ConsumeCash ,remainCash =@RemainCash ,isCheck =@IsCheck where cardNo =@CardNo
--删除online表记录
delete T_Online where cardNo =@CardNo
--更新Card余额
Update T_Card set remainCash =@RemainCash where cardNo =@CardNo
END
程序的调用
Public Function IupdateInfo(OfflineInfo As LineEntity) As Boolean Implements ILineDAL.IupdateInfo
Dim SQLHelper As DAL.SqlHelper = New DAL.SqlHelper()
Dim Sql As String = "Pro_Offline" '调用存储过程
Dim result As Integer
Dim Sqlparams As SqlParameter() = {New SqlParameter("@CardNo", OfflineInfo.CardNo),
New SqlParameter("@OffDate", OfflineInfo.OffDate),
New SqlParameter("@OffTime", OfflineInfo.OffTime),
New SqlParameter("@ConsumeCash", OfflineInfo.ConsumeCash),
New SqlParameter("@ConsumeTime", OfflineInfo.ConsumeTime),
New SqlParameter("@RemainCash", OfflineInfo.RemainCash),
New SqlParameter("@IsCheck", OfflineInfo.IsCheck)}
result = SQLHelper.ExecNonQuery(Sql, CommandType.StoredProcedure, Sqlparams)
If result <> 0 Then
Return True
Else
Return False
End If
End Function
这样就可以完成同时更新三张表的操作了。有没有很方便?
#总结
认识一个事物时用到了一个很棒的套路–门卫思维,where,why ,what ,how ,when 。这些问题需要自己问自己,然后全面分析这个事物。