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

Posted

技术标签:

【中文标题】执行不返回结果的存储过程时引发错误【英文标题】:Error thrown when executing a stored procedure that returns no results 【发布时间】:2013-01-18 19:24:37 【问题描述】:

我目前在我们的一个项目中使用 dapper,我们一直在执行存储过程。在前几个方法中,当我们执行的存储过程返回行时,一切正常。

现在,当我尝试从找到时返回信息的存储过程中获取数据时,我遇到了一个问题。这是一个非常常见的用例(例如,在应用程序上记录用户)。当调用Query 方法时,sproc 没有返回任何行,dapper 会抛出一个带有消息的ArgumentException

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

我使用的代码是:

using (var conn = new SqlConnection(connString))

    conn.Open();

    return conn.Query<Customer>(
            sql: "prc_GetCustomer",
            param: new  Parameter = p ,
            commandType: CommandType.StoredProcedure).FirstOrDefault();

我知道有一个Execute 方法应该在过程预计不会返回任何行但它真的不是我的情况时使用。此外,dapper 异常具有误导性,因为我没有使用多重映射。

有什么想法吗? 谢谢!

【问题讨论】:

存储过程是返回零行数据集还是根本不返回数据集? 当存储过程什么都不返回时,我可以重复这个问题。如果它只返回一个与 对象结构相同的空结果集,它就可以正常工作。您是否有理由不能返回空数据集而不是什么? 现在这个过程什么也没有返回,我同意这不是一个好的解决方案,但是我们有很多像这样的遗留存储过程。我只是想知道 dapper 是否无法检查是否没有字段而只返回 default(T) 是的,表面上我不知道该怎么做。即使您只使用 Query 方法而不是 Query 它也会抛出相同的 ArgumentException 您能否澄清一下:它是否返回零网格?还是返回任何空网格? 【参考方案1】:

如果查询没有返回任何结果网格,您应该使用 Execute,而不是 Query。

【讨论】:

我认为这些存储过程在返回网格(或空网格)之前检查某些内容时使用了错误的逻辑。这是一个由常规 DbDataReader 支持的语义事物,所以它来到了这一点。恕我直言,Dapper 应该支持这种情况,但我会接受答案。 所以如果我读对了 PROC-A -> 有时会返回 0 条记录;返回 0 条记录时出现此错误;所以为了解决这个问题,我必须做一个额外的调用来做一个计数,以确保当它处于不返回记录的状态时我不会调用这个 proc? @snafu 不,不相关。从选择返回零行与根本不进行选择非常不同。如果它不做选择:执行。

以上是关于执行不返回结果的存储过程时引发错误的主要内容,如果未能解决你的问题,请参考以下文章

存储过程在 SSMS 中执行时都返回结果,但从代码执行时只有一个返回结果

阿里云调用 API 服务后返回啥结果

带 Pivot 的存储过程不返回结果结构,而是返回零值

MySQL 过程将空结果返回给 PHP

Apache DbUtils:处理从存储过程返回的多个结果集

有没有办法在执行存储过程或函数时提前确定要返回的结果集的数量?