机房重构存储过程

之前只是听他们说存储过程,自己这次通过实践来学习。

1、何为存储过程

 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。 
2、为何使用存储过程(正数为优点,负数为缺点)

       自己的感受:

      1)重复使用:就相当于定义了一个模块一样,只要调用它就可以实现某个功能,不用再写重复代码。

      2)参数少:因为是在数据库中,所以可以直接调用数据库中的数据,减少代码量。

      3)安全:防止了SQL注入。

     -1)调试困难:当有一处错误时后边很多地方报错,查看原因时会不清楚错误怎么改。

      更多原因:     

      4)减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。
      5)安全性。参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。
     -2)移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。
     -3)重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
     -4)如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。
3、使用存储过程需要注意什么——看代码注释
USE [charge]  
GO  
/****** Object:  StoredProcedure [dbo].[proc_Recharge]    Script Date: 11/23/2017 9:30:33 PM ******/  
SET ANSI_NULLS ON  
GO  
SET QUOTED_IDENTIFIER ON  
GO  
-- =============================================  
-- Author:      <Author,,智雪艳>  
-- Create date: <2017-11-23,,>  
-- Description: <充值 Recharge,,>  
-- =============================================  
CREATE PROCEDURE proc_Recharge  

--创建存储过程时格式应该是:CREATE PROCEDURE 名称;执行后会变成:ALTER PROCEDURE [dbo].[proc_Recharge]  
  
    --定义用到的变量  
    @cardno  char(11),  
    @userid char,  
    @rechargedate date,  
    @rechargemoney money,  
    @rechargetime time,  
    @ischeck bit,  
    @balance money    
AS  
--在存储过程中需要用到临时变量,临时变量的定义如下  
    declare  
    @remaincash money  
BEGIN  
--临时变量的赋值  
    set @remaincash =(select balance from Card_Info where cardno=@cardno );   

--查找表里一个数据格式为select balance from Card_Info where cardno=@cardno   
  
      
    --添加充值表  
    insert into Rechargecash_Info(cardno ,userid ,rechargemoney ,rechargedate ,rechargetime,ischeck,balance )  
    values(@cardno,@userid ,@rechargemoney ,@rechargedate ,@rechargetime ,@ischeck ,@balance+@remaincash );  
  
    --更新卡表  
    Update Card_Info set balance =balance +@rechargemoney;  
  
    --更新学生表  
    select * from Student_Info where cardno=@cardno   
    Update Student_Info set balance =balance +@rechargemoney;  
  
END  



4、在D层调用存储过程

 '充值
    Public Function IRecharge(RechargeInfo As E_RechargeEntity, CardInfo As E_CardEntity, StudentInfo As E_StudentEntity) As Boolean Implements I_RechargeIDAL.IRecharge
        Dim SQLHelper As New SQLHelper()
        Dim result As Boolean

        'SQL语句,这里直接调用数据库中的存储过程
        Dim sql As String = "proc_Recharge"

        '增加充值记录
        Dim Parameter As SqlParameter() = {New SqlParameter("@cardno", RechargeInfo.CardNo),
                                          New SqlParameter("@userid", RechargeInfo.UserId),
                                          New SqlParameter("@rechargedate", Now),
                                          New SqlParameter("@rechargemoney", RechargeInfo.RechargeMoney),
                                          New SqlParameter("@rechargetime", Convert.ToDateTime(Now).ToShortTimeString),
                                          New SqlParameter("@ischeck", RechargeInfo.IsCheck),
                                          New SqlParameter("@balance", RechargeInfo.RechargeMoney)}

        result = SQLHelper.ExecNonQuery(sql, CommandType.StoredProcedure, Parameter)

        Return result

    End Function




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 33
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值