尝试执行DB查询时,Dapper(用于.NET)未替换参数

smtd7mpg  于 2023-01-18  发布在  .NET
关注(0)|答案(1)|浏览(126)

当我Execute下面的SQL时,Dapper不是替换参数,而是将原始数据写入数据库。

(or对于某些模糊的精确SQL)

INSERT INTO
    Blah
SELECT
    Id,
    GETUTCDATE(),
    'Updated Status to WITHDRAWN. JIRA: @JiraTicket. By: admin maintenance task'
FROM
    Blahs
WHERE
     Id = @Id

相反,这是插入到DB中的相同数据:

Updated Status to WITHDRAWN. JIRA: @JiraTicket. By: admin maintenance task

jiraTicket的值== AAA123
代码为:

using (TransactionScope scope = new())
{
    using (var db = new SqlConnection(_connectionString))
    {
        var rowsaffected = db.Execute(command, new
        {
            Id = id,
            JiraTicket = jiraTicket
        });

        // snipped some UI displaying logic
    }

    if (!isTestRun)
    {
        scope.Complete();
    }
}

我就是不明白?为什么不是代课?

更新1:

我也尝试过这个方法,它给出了相同的输出:

DECLARE @Jira VARCHA(20) = @JiraTicket;

INSERT INTO
    Blah
SELECT
    Id,
    GETUTCDATE(),
    'Updated Status to WITHDRAWN. JIRA: @Jira. By: admin maintenance task'
FROM
    Blahs
WHERE
     Id = @Id

更新2:

这个 * 确实 * 有效,但我觉得很脏。有没有比这个更好的方法?注意:生成参数时的字符串替换....

using (TransactionScope scope = new())
{
    using (var db = new SqlConnection(_connectionString))
    {
        var rowsaffected = db.Execute(command, new
        {
            Id = id,
            JiraTicket = $"Updated Status to WITHDRAWN. JIRA: {jiraTicket} . By: admin maintenance task"
        });

        // snipped some UI displaying logic
    }

    if (!isTestRun)
    {
        scope.Complete();
    }
}
xytpbqjk

xytpbqjk1#

参数标记不能位于varchar文本内。如果要将参数值追加到字符串,请使用CONCAT
所以应该是:

INSERT INTO
    Blah
SELECT
    Id,
    GETUTCDATE(),
    CONCAT('Updated Status to WITHDRAWN. JIRA: ', @JiraTicket, '. By: admin maintenance task')
FROM
    Blahs
WHERE
     Id = @Id

相关问题