【问题标题】:Dapper "Procedure or function sp_XXXX has too many arguments specified."Dapper “程序或函数 sp_XXXX 指定了太多参数。”
【发布时间】:2013-06-18 01:21:51
【问题描述】:

我正在使用带有模板参数的 Dapper 的 DynamicParamters 对象来为我的实体生成参数。调用存储过程后,出现以下错误“过程或函数 sp_MemberSave 指定了太多参数。”。我的一些实体确实有额外的属性用于业务逻辑等。有没有办法确保 dapper 只传递存储过程的实际参数?似乎 Dapper 会先读取存储过程,然后设置参数,这样它只会使用正确的参数。如何使用模板功能限制参数?

【问题讨论】:

  • 您是否将您的对象(您的类的一个实例)作为参数传递给存储过程?
  • 我正在调用 DynamicParameters(entity) 其中 entity 是我的实体之一。我的想法是,这将通过读取实体并生成参数集合来生成参数集合。我还认为它会忽略任何不是实际存储的过程参数的参数。是这样吗?

标签: c# asp.net-mvc-3 dapper micro-orm


【解决方案1】:

尝试从您的对象创建一个适当参数的匿名类型...如果您的类有 A、B、C 和 D,而您只需要 A 和 B:

DynamicParameters(new { A = entity.A, B = entity.B });

【讨论】:

  • 我希望我不必那样做,因为有很多参数。很多。
  • 我明白了。我们在我的公司为 Dapper 编写了一个包装器,它具有一些简洁的功能......其中一个是添加一个 [NotParameter] 属性,该属性允许包装器忽略属性/字段。
  • 我正在查看他们的代码,以便在添加参数时找到过滤参数的位置,但执行添加的部分似乎有点难以理解:-)。
  • 对。我想我找到了它生成参数的位置,并试图翻译它。不过,这很有趣。
  • 好的,David H。当您的团队创建 [NoParameter] 属性时,您是否创建了一个扩展方法,该方法将使用反射将实体转换为参数列表。如果是这种情况,我唯一的问题是您是否注意到使用反射的任何性能损失?
【解决方案2】:

我可以很清楚这里的场景吗?如果您只是传递实体(而不是 DynamicParameters),它 进行此分析;即conn.Execute("some sql", someEntity); - 然后它只会添加它可以看到在 SQL 中使用的someEntity 的成员。可能有一些误报,因为它不执行完整的词法SQL分析,所以在cmets中的一个参数,即:

-- removed by Fred: where row.Date < @StartDate

仍将包括在内(因此在上面的示例中,成员 StartDate 将符合条件,即使它可能实际上不需要)。

但是; DynamicParameters 当前信任自定义实现。我想我们可以将参数分析检查移到这一点之后,但我更愿意先了解完整的场景。

【讨论】:

  • "...它确实进行了分析" - 它是否对存储过程进行分析(这是 OP 使用的)?
  • @Joe 如果命令类型说存储过程,那么不:它没有。但是,也可以通过文本命令类型(通过exec)使用存储过程——我经常看到这种情况——因此希望看到一个非常清晰的例子。但有一件事是肯定的:dapper 永远不会尝试“先读取存储过程”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
  • 2019-10-07
相关资源
最近更新 更多