【机房重构】--存储过程(下机实践)

来源:互联网 发布:淘宝天猫运营招聘 编辑:程序博客网 时间:2024/06/01 22:20

前言:

之前觉得存储过程是很高大上的东西,听说还不能滥用,所以一直有些避讳,但是这并不是“富人”,接受+学习的思维方式。不管什么东西肯定都是需要多方面看待的,重点是我们需要先了解,接受,然后去学习和发现有什么样的优缺点,不能听别人说什么就是什么,实践过才有发言权嘛。

简单了解

  • 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) ASBEGIN    -- 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 。这些问题需要自己问自己,然后全面分析这个事物。

原创粉丝点击