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

使用Dapper(.NET)执行SQL时参数未替换的问题求助

Dapper参数未正确替换的规范解决方案

问题根源

你遇到的核心问题是参数占位符被包含在SQL字符串常量中,Dapper和数据库引擎都不会解析单引号包裹的字符串内部的@xxx占位符,导致它被原样写入数据库。

正确实现方案

根据你的使用场景,分两种情况给出规范的参数化写法:

1. 字段值直接为参数内容

如果插入的字段值就是Jira工单编号本身,直接将参数对应到字段即可:

// SQL语句:参数占位符直接作为字段值
var insertSql = "INSERT INTO YourTable (JiraTicket) VALUES (@JiraTicket)";
// 参数对象:属性名与SQL占位符一致
var parameters = new { JiraTicket = "AAA123" };
// 执行插入
connection.Execute(insertSql, parameters);

2. 字段值为包含参数的拼接字符串

如果需要插入的是类似"Ticket: AAA123"这样的拼接内容,推荐两种安全方式:

方式一:用SQL内置函数拼接(推荐)

借助数据库的字符串拼接函数(比如SQL Server的CONCAT,MySQL的CONCAT或||),将固定文本和参数拼接后插入:

var insertSql = "INSERT INTO YourTable (Content) VALUES (CONCAT('Ticket: ', @JiraTicket))";
var parameters = new { JiraTicket = "AAA123" };
connection.Execute(insertSql, parameters);
方式二:在C#中构造完整参数值

先在C#里拼接好需要的字符串,再作为参数传入(注意这不是拼接SQL语句,而是构造参数值,不会有注入风险):

// 先构造完整的内容字符串
var content = $"Ticket: {jiraTicket}"; // jiraTicket为"AAA123"
// SQL语句使用参数接收完整内容
var insertSql = "INSERT INTO YourTable (Content) VALUES (@Content)";
var parameters = new { Content = content };
connection.Execute(insertSql, parameters);

为什么之前的尝试无效

  • 在SQL中声明中间变量后,若依然把变量放在单引号内(比如'Ticket: @Ticket'),数据库会将@Ticket视为字符串的一部分,不会解析为变量。
  • 直接拼接SQL字符串虽然能生效,但会引入严重的SQL注入风险,属于不安全写法,绝对不推荐。

Dapper参数使用注意事项

  • 确保参数占位符(@xxx)不在SQL的单引号字符串内部,否则不会被解析。
  • 参数对象的属性名要与SQL中的占位符名称完全匹配(大小写不敏感,但保持一致可避免不必要的问题)。
  • 不同数据库的参数占位符格式可能不同:SQL Server用@,MySQL用?或@,Oracle用:xxx,需对应数据库调整。

内容的提问来源于stack exchange,提问作者Pure.Krome

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:50:22