SQL存储过程及事务

存储过程是将个SQL语句封a装到一个方法中,好处一是方便客户端的调用,二是执行速度会更快

--创建存储过程进行转账
create proc ups_transfer
@from char,   --源账户 
@to char,     --目标账户
@balance money,    --转账金额
@resultnum int output  --返回结果1=转账成功,2=转账失败,3=金额不足
as
begin
    --判断账户余额是否足够转账
    declare @money money
    select @money=balance from bank where CID=@from
    if @money - @balance >=10
    begin
        --开始转账
        begin transaction  --转账操作放到事务里面
        declare @sum int=0 
        --账户1扣款
        update bank set balance = balance -@balance where cid=@from 
        set @sum=@sum + @@ERROR
        --账户2增款
        update bank set balance= balance + @balance where cid=@to
        set @sum=@sum + @@ERROR
        if @sum<>0
        begin
            set @resultnum=2   --转账失败
            rollback
        end
        else
        begin
            set @resultnum=1   --转账成功
            commit
        end
    end
    else
    begin
        set @resultnum=3 --余额不足
    end
end
select * from bank
declare @r int
exec ups_transfer  '0001','0002',10, @r
print @r

declare @re int
exec ups_transfer @from='0001',@to='0002',@balance=0,@resultnum= @re output
print @re

 ADO.NET调用存储过程

SqlParameter[] pms = new SqlParameter[]{
  new SqlParameter("@from",SqlDbType.char){Value=from},
  new SqlParameter("@to",SqlDbType.char){Value=to},
  new SqlParameter("@balance",SqlDbType.Money){Value=money},
  new SqlParameter("@resultnum",SqlDbType.Int){Direction=ParameterDirection.Output}
};
SqlHelper.ExecuteNonQuery("ups_transfer",CommandType.StoredProcedure,pms);
//拿到输出参数
int result= pms[3];
switch(result){
  case 1: //转账成功
    break;
  case 2: //转账失败
    break;
  case 3: //余额不足
    break;
}

 

posted @ 2020-05-24 22:17  boenotuch  阅读(658)  评论(0编辑  收藏  举报