使用.NET Core EF 5调用存储过程插入数据遇参数传递问题求助
解决EF Core 5调用PostgreSQL存储过程插入数据的问题
你的代码存在核心语法错误和安全风险,以下是修正方案:
错误原因
- PostgreSQL不支持SQL Server风格的
@参数名占位符,需使用$1、$2或命名参数格式 - 原代码的字符串拼接逻辑混乱,导致生成的SQL语法无效
- 直接拼接用户输入存在严重SQL注入风险
修正后的代码示例
方式1:位置参数传递(推荐,适配多数PG存储过程)
[HttpPost] public async Task<IActionResult> Adduser(string fname, string lname, string pass, string uname, string actname, int cnumber, string cname, string depname) { // 符合PostgreSQL的存储过程调用语法,使用参数化查询避免注入 var result = await _context.Database.ExecuteSqlRawAsync( "CALL transfer($1, $2, $3, $4, $5, $6, $7, $8)", fname, lname, pass, uname, actname, cnumber, cname, depname ); await _unitOfWork.CompleteAsync(); return Ok(); }
方式2:命名参数传递(适用于定义了参数名的存储过程)
如果你的存储过程定义为CREATE PROCEDURE transfer(p_fname text, p_lname text, ...),可使用命名参数:
[HttpPost] public async Task<IActionResult> Adduser(string fname, string lname, string pass, string uname, string actname, int cnumber, string cname, string depname) { var result = await _context.Database.ExecuteSqlRawAsync( "CALL transfer(p_fname => @fname, p_lname => @lname, p_pass => @pass, p_uname => @uname, p_actname => @actname, p_cnumber => @cnumber, p_cname => @cname, p_depname => @depname)", new SqlParameter("@fname", fname), new SqlParameter("@lname", lname), new SqlParameter("@pass", pass), new SqlParameter("@uname", uname), new SqlParameter("@actname", actname), new SqlParameter("@cnumber", cnumber), new SqlParameter("@cname", cname), new SqlParameter("@depname", depname) ); await _unitOfWork.CompleteAsync(); return Ok(); }
注意事项
- 确保存储过程的参数顺序、数据类型与传递的参数完全匹配
- 禁止直接拼接用户输入到SQL字符串中,必须使用参数化查询
- 若存储过程包含输出参数或返回结果,需调整参数传递逻辑并处理返回值
内容的提问来源于stack exchange,提问作者Munther Alkhwaldeh
相关产品推荐
相关产品推荐

