④编写存储过程:
在数据库中:指定数据库-->可编程性-->存储过程-->右键:新建-->存储过程:
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();
}










