问题描述
我使用 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
作为原始命令发出,它不会传递参数。
注意:我们已经讨论将单字命令自动解释为存储过程,但到目前为止:我们还没有进行这种更改 - 因此需要明确指定命令类型。 >