1

我正在使用 DapperDynamicParameters将参数字典从我的 .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

错误

原文(法文):

La procédure ou fonction '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不同的方法吗?

谢谢你的帮助 :)

4

1 回答 1

3

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

注意:我们已经讨论过将单字命令自动解释为存储过程,但迄今为止:我们还没有做出改变——因此需要明确指定命令类型。

于 2021-04-08T09:54:25.850 回答