【问题标题】:Parameter not provided to the stored procedure when I use Dapper DynamicParameter from C# dictionary当我使用 C# 字典中的 Dapper DynamicParameter 时未向存储过程提供参数
【发布时间】:2021-07-04 04:12:41
【问题描述】:

我正在使用 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 吗?

感谢您的帮助:)

【问题讨论】:

  • exec sp_executesql N'[dbo].[hp_GetLinksByCities]', ... 并没有将参数传递给 proc,只是传递给 sp_executesql。 (注意我不知道如何解决这个问题,我对 Dapper 一无所知,只是解释为什么会发生错误。)
  • 我有点困惑——proc 只接受 2 个参数,但你似乎在循环中添加了很多——一般来说,这是行不通的;您需要每对执行一次,如果您要每对执行一次,则根本不需要动态参数。随机尝试:将@ 从字符串中取出,即cities.Add("cityName1", "New-York");
  • @MarcGravell 实际上真正的 SP 接受 25 个参数 x2。我在这里简化了代码,但我忘了删除 foreach 行;)

标签: c# tsql stored-procedures dapper dynamicparameters


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    相关资源
    最近更新 更多