Dapper 执行存储过程引发关于多映射的 ArgumentException

Posted

技术标签:

【中文标题】Dapper 执行存储过程引发关于多映射的 ArgumentException【英文标题】:Dapper execute stored procedure raises ArgumentException about multi-mapping 【发布时间】:2012-01-20 16:56:13 【问题描述】:

我有一个存储过程,我正在尝试使用 Dapper 执行它引发的错误似乎与我正在尝试做的事情无关,尽管我似乎无法弄清楚我在做什么我做错了。

这是我试图调用的存储过程的签名:

ALTER PROCEDURE [dbo].[stp_UpdateInboundDaf]
    @InboundType varchar(255),
    @Id bigint,
    @UserId bigint,
    @DonationID bigint = NULL,
    @StatusId int = NULL,
    @FinalFlag bit = NULL,
    @ValidatedFlag bit = NULL,
    @SignedFlag bit = NULL
AS ...

这是我为尝试调用该过程而编写的代码:

_cnx.Query("stp_UpdateInboundDaf", new

    InboundType = parameters.InboundType,
    Id = parameters.Id,
    UserId = parameters.UserId,
    DonationId = parameters.DonationId,
    StatusId = parameters.StatusId,
    FinalFlag = parameters.IsFinal,
    ValidatedFlag = parameters.Validated,
    SignedFlag = parameters.Signed
, commandType: CommandType.StoredProcedure);

这些是传入的参数:

这是我得到的错误:

"使用多映射 API 时,如果您有除 Id 以外的键,请确保设置 splitOn 参数 参数名称:splitOn"

更新

SqlMapper.GetDynamicSerializer(IDataRecord reader, int startBound, int length, bool returnNullIfFirstMissing) 方法引发了错误。这是错误位置和堆栈跟踪:

有什么想法吗?

我正在使用当前版本的 Dapper(我字面意思只是在写这个问题之前克隆了 Github 上的 repo 并将 SqlMapper.cs 拉到我的项目中)。

【问题讨论】:

调试器说什么?您有来源,应该清楚错误发生在哪里。在最后一个可跟踪的堆栈位置周围提供堆栈跟踪和相关代码。 是的,对不起...我应该把它包括在内。我将使用引发错误的位置更新帖子。 禁用优化,我怀疑异常发生在上一行。 呃...我知道我的问题是什么。已更新。 很高兴您找到了解决方案 :) 自己想办法总是更好。反正+1 【参考方案1】:

我知道我的问题出在哪里。我太从字面上遵循这些例子了。我的存储过程不返回任何值,所以SqlMapper 试图序列化不存在的东西。我将代码更改为使用_cnx.Execute(...) 而不是_cnx.Query(...),现在一切正常。

【讨论】:

以上是关于Dapper 执行存储过程引发关于多映射的 ArgumentException的主要内容,如果未能解决你的问题,请参考以下文章

Dapper 映射结果列表

dapper.net 转载

执行不返回结果的存储过程时引发错误

Dapper系列 作者:懒懒的程序员一枚

将 Dapper 查询映射到对象集合(它本身有几个集合)

Dapper 多参数存储过程查询不会从数据库返回任何内容