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

//查 获取信息
string
userId =888886868886; //多个参数多表组合值 SqlParameter[] Param = { new SqlParameter("@UserId", System.Data.SqlDbType.VarChar) }; if (string.IsNullOrEmpty(userId)) { Param[0].Value = DBNull.Value; } else { Param[0].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, 20), new SqlParameter("@rt_msg", System.Data.SqlDbType.NVarChar, 200), //输出一定要定义字符类型长度 以免报错 }; if (string.IsNullOrEmpty(strMobilePhone)) { Param[0].Value = DBNull.Value; } else { Param[0].Value = strMobilePhone; } Param[1].Value = strPayPrice; if (string.IsNullOrEmpty(strParkUserId)) { Param[2].Value = DBNull.Value; } else { Param[2].Value = strParkUserId; } Param[2].Direction = ParameterDirection.Output; Param[3].Direction = ParameterDirection.Output; int numdata = await _dbcontext.ExecuteNonQueryAsync("SP_Pay", Param); string rtcode = Param[2].Value.ToString(); string rtmessage = Param[3].Value.ToString(); if (numdata < 0) { 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= '1001';
                  set @rt_msg= '支付金额不能为空!';
                  RETURN;
          END;
    IF   (@before_overprice=0)
          
          BEGIN
                  set @rt_code= '1001';
                  set @rt_msg= '账户余额不足!';
                  RETURN;
          END;
          
     IF   (@PayPrice>@before_overprice)
           
          BEGIN
                  set @rt_code= '1001';
                  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)
                                    '0'--默认
                           );
    END;
    commit transaction
    set  @rt_code= '0000';
     set  @rt_msg= '交易成功!';
     return

     end try 

    begin catch

    set  @rt_code= '9999';
     set  @rt_msg= '交易失败!';
    
    rollback transaction
    end catch
END
原文地址:https://www.cnblogs.com/Warmsunshine/p/8473988.html