SQL Server存储过程在C#中调用的简单实现方法

2020-05-06 14:05:06王冬梅

④编写存储过程:

在数据库中:指定数据库-->可编程性-->存储过程-->右键:新建-->存储过程:

SQL Server中编写的SQL语句没有默认的格式化,所有代码排版按照我自己习惯进行Tab缩进

建议放到编辑器中查看下面的存储过程,会好看一些!

SQL大小写不敏感,我习惯小写,方便阅读!

-- =============================================
-- Author: shanzm
-- Create date: 2020年5月2日 19:56:51
-- Description: 模拟账户之间转账
-- =============================================
create procedure pro_transfer_szmbank
@from bigint,
@to bigint,
@balance decimal(18,0),
@returnNum int output--(1表示转账成功,2表示失败,3表示余额不足)
as
begin
 --判断转出账户是否有足够的金额
 declare @money decimal(18,0)
 select @money=Balance from dbo.szmBank where Id=@from; 
 if @money-@balance>=0.1 
   --开始转账
  begin 
  begin transaction
   declare @sum int =0
   --转出账户扣钱
   update szmBank set balance=balance-@balance where id=@from
   set @sum=@sum+@@error
   --转入账户加钱
   update szmBank set balance=balance+@balance where id=@to
   set @sum=@sum+@@error
   --判断是否成功
   if @sum<>0
   begin
    set @returnNum=2--转账失败
    rollback
   end
   else
   begin
    set @returnNum=1--转账成功
    commit
   end
  end
 else
 begin
  set @returnNum=3--余额不足
 end
end
go

在数据库中执行测试(F5):

--执行测试:
declare @ret int
execute pro_transfer_szmbank 
@from='1',
@to='2',
@balance='10',
@returnNum=@ret output--注意输出参数在执行语句中也是要表明"output"
print @ret --结果是打印:1,即存储过程实现成功

【注意】:

我们需要查看某个存储过程,则可以使用数据中自带的存储过程查看: sp_helptext pro_transfer_szmBank 修改现有的存储过程,右键存储过程-->修改:显示的存储过程只是把创建存储过程中的create变为了alert 可以在SQL Server的SQL窗口选中某些SQL语句,点击执行,即执行选中的SQL语句

⑤控制台中测试

新建一个控制台项目,在配置文件中添加连接字符串

因为封装的SqlHelper中需要从配置文件中读取数据库连接字符串,所以添加引用:System.Configuration

static void Main(string[] args)
{
  //转出账户的Id
  int from = 1;
  //转入账户的Id
  int to = 2;
  //转账金额
  decimal balance = 10;

  SqlParameter[] param =
  {
    new SqlParameter ("@from",from),
    new SqlParameter("@to",to),
    new SqlParameter ("@balance",balance),
    //-------------------------------注意:这里设置为输出参数
    new SqlParameter ("@returnNum",System.Data.SqlDbType.Int{Direction=System.Data.ParameterDirection.Output }
  };

  //------------------------设置CommonType为StorProcedure类型
  SqlHelper.ExecuteNonquery("pro_transfer_szmbank",System.Data.CommandType.StoredProcedure, param);

  //------------------------获取输出参数
  //根据输出参数判断转账结果
  int outPutparam = Convert.ToInt16(param[3].Value);

  switch (outPutparam)
  {
    case 1: Console.WriteLine($"success:从Id:{from}转账{balance}元到Id:{to}");break;
    case 2: Console.WriteLine("error"); break;
    case 3: Console.WriteLine("余额不足"); break;
  }

  Console.ReadKey();
}