存储过程是将个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;
}