You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:20:28