当我使用 C# 字典中的 Dapper DynamicParameter 时,未向存储过程提供参数

问题描述

我使用 Dapper DynamicParameters 将参数字典从我的 .NET Core 应用程序发送到 sql Server,但出现错误

未提供参数@cityName1

但是当我跟踪查询时,我可以看到它存在。

这是代码

填写字典:

Dictionary<string,object> cities = new Dictionary<string,object>();
cities.Add("@cityName1","New-York");
cities.Add("@cityId1",123);

对 Dapper 的调用

DynamicParameters dbArgs = new DynamicParameters();

foreach (var pair in cities)
{
   dbArgs.Add(pair.Key,pair.Value);
}

return await connection.QueryAsync<Provider>(sql_GET_LINKS_BY_CITIES,dbArgs);

存储过程:

CREATE PROCEDURE [dbo].[hp_GetLinksByCities]
    (@cityName1 NVARCHAR(25),@cityId1 INT)
AS
BEGIN
    -- code
END

来自分析器的跟踪:

exec sp_executesql N'[dbo].[hp_GetLinksByCities]',N'@cityName1 nvarchar(4000),@cityId1 int',@cityName1=N'Marseille',@cityId1=1970

错误

原文(法文):

程序“hp_GetLinksByCities”参加 le paramètre '@cityName1',qui n'a pas étéfourni。

翻译成英文:

存储过程或函数“hp_GetLinksByCities”需要一个未提供的“@cityName1”参数

当我在执行这个SSMS代码,我得到了同样的错误,但这种语法,它的做工精细:

exec [dbo].[hp_sp_GetDirectoryPageLinksByCities] @cityName1=N'Marseille',@cityId1=1970

通常,Dapper 以这种方式发送订单,并且运行良好。为什么这次表现不同?

我不知道出了什么问题……我需要以不同的方式使用 DynamicParameter 吗?

感谢您的帮助:)

解决方法

您在对 Dapper 的调用中缺少 commandType: CommandType.StoredProcedure,因此它将其作为普通文本查询发出,这意味着它本身仅将 hp_GetLinksByCities 作为原始命令发出,它不会传递参数

注意:我们已经讨论将单字命令自动解释为存储过程,但到目前为止:我们还没有进行这种更改 - 因此需要明确指定命令类型。 >