.NET CORE EF 框架调用存储过程

时间:2023-03-08 22:59:19
.NET  CORE  EF 框架调用存储过程
//查 获取信息
string userId =; //多个参数多表组合值
SqlParameter[] Param =
{
new SqlParameter("@UserId", System.Data.SqlDbType.VarChar)
}; if (string.IsNullOrEmpty(userId))
{ Param[].Value = DBNull.Value; }
else
{ Param[].Value = userId; } var userdata = await _context.ExecSpAsync("SP_GetList", Param);
       /// <summary>
/// 异步执行带有参数的存储过程方法 获取信息集合以及返回空值处理
/// </summary>
/// <param name="db"></param>
/// <param name="sql"></param>
/// <param name="sqlParams"></param>
/// <returns></returns>
public async static Task<ArrayList> ExecSpAsync(this DefaultDbContext db, string sql, SqlParameter[] sqlParams)
{ var connection = db.Database.GetDbConnection();
using (var cmd = connection.CreateCommand())
{
await db.Database.OpenConnectionAsync();
cmd.CommandText = sql;
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddRange(sqlParams);
var dr = await cmd.ExecuteReaderAsync();
var columnSchema = dr.GetColumnSchema();
var data = new ArrayList();
while (await dr.ReadAsync())
{
var item = new Dictionary<string, object>();
foreach (var kv in columnSchema)
{
if (kv.ColumnOrdinal.HasValue)
{
var itemVal = dr.GetValue(kv.ColumnOrdinal.Value);
item.Add(kv.ColumnName, itemVal.GetType() != typeof(DBNull) ? itemVal:"");
}
}
data.Add(item);
}
dr.Dispose();
return data;
}
} /// <summary>
/// 异步执行带有参数的存储过程方法 增删改操作以及返回带有输出的参数
/// </summary>
/// <param name="db"></param>
/// <param name="sql"></param>
/// <param name="sqlParams"></param>
/// <returns></returns>
public async static Task<int> ExecuteNonQueryAsync(this DefaultDbContext db, string sql, SqlParameter[] sqlParams)
{
int numint;
var connection = db.Database.GetDbConnection();
using (var cmd = connection.CreateCommand())
{
await db.Database.OpenConnectionAsync();
cmd.CommandText = sql;
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddRange(sqlParams);
numint = await cmd.ExecuteNonQueryAsync();
} return numint;
}
//增删改
SqlParameter[] Param =
{ new SqlParameter("@MobilePhone", System.Data.SqlDbType.VarChar),
new SqlParameter("@PayPrice", System.Data.SqlDbType.VarChar),
new SqlParameter("@rt_code", System.Data.SqlDbType.NVarChar, ),
new SqlParameter("@rt_msg", System.Data.SqlDbType.NVarChar, ), //输出一定要定义字符类型长度 以免报错
};
if (string.IsNullOrEmpty(strMobilePhone))
{ Param[].Value = DBNull.Value; }
else
{ Param[].Value = strMobilePhone; } Param[].Value = strPayPrice; if (string.IsNullOrEmpty(strParkUserId))
{ Param[].Value = DBNull.Value; }
else
{ Param[].Value = strParkUserId; } Param[].Direction = ParameterDirection.Output;
Param[].Direction = ParameterDirection.Output; int numdata = await _dbcontext.ExecuteNonQueryAsync("SP_Pay", Param);
string rtcode = Param[].Value.ToString();
string rtmessage = Param[].Value.ToString();
if (numdata < )
{
return AsResult.Error(Convert.ToInt32(rtcode), rtmessage);
}

存储过程代码:

ALTER PROCEDURE [dbo].[SP_GetList]
(
@UserId varchar(100)
) AS BEGIN begin transaction
begin try
BEGIN SELECT DISTINCT
* FROM UserInfo_test usertest
where usertest.UserID =@UserID
ORDER BY usertest.UserID DESC; END
commit transaction
end try
---------------------------------------------------------------------------------------------------------------------------- begin catch print '执行存储异常' rollback transaction end catch END
CREATE PROCEDURE [dbo].[SP_Pay] 

    (
@MobilePhone varchar(50),
@PayPrice varchar(100) ,
@ParkUserId varchar(50),
@rt_code varchar(20) output,
@rt_msg nvarchar(200) output )
AS
--declare @rt_code varchar(50); --声明变量
declare @before_overprice DECIMAL(9,2);
declare @P_overprice DECIMAL(9,2);--变化后余额
declare @YuanPayPwd nvarchar(100); BEGIN
;
select @before_overprice=isnull(OveragePrice,0) FROM Meb_Overage WHERE ParkUserId=@ParkUserId; IF (@PayPrice is null) BEGIN
set @rt_code= '';
set @rt_msg= '支付金额不能为空!';
RETURN;
END;
IF (@before_overprice=0) BEGIN
set @rt_code= '';
set @rt_msg= '账户余额不足!';
RETURN;
END; IF (@PayPrice>@before_overprice) BEGIN
set @rt_code= '';
set @rt_msg= '当前账户余额不足!';
RETURN;
END; begin transaction
begin try
if(@ParkUserId is not null)
BEGIN
update Meb_Overage set OveragePrice=(OveragePrice-@PayPrice) WHERE ParkUserId = @ParkUserId ; ---支付后金额
select @P_overprice=isnull(OveragePrice,0) FROM Meb_Overage WHERE ParkUserId=@ParkUserId; INSERT INTO Meb_Details(ParkUserId,
PayPrice,
AddTime ,
BalanceStatus )
VALUES
( @ParkUserId,
@PayPrice, --缴费支付金额
SYSDATETIME(),-- CONVERT(varchar(100), GETDATE(), 120)
''--默认
);
END;
commit transaction
set @rt_code= '';
set @rt_msg= '交易成功!';
return end try begin catch set @rt_code= '';
set @rt_msg= '交易失败!'; rollback transaction
end catch
END