.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
分类:
Asp.Net Core
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2014-02-26 jquery+ashx checkbox 单选判断是否true 和 false 传值操作