执行不返回结果的存储过程时引发错误
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 异常具有误导性,因为我没有使用多重映射。
有什么想法吗? 谢谢!
【问题讨论】:
存储过程是返回零行数据集还是根本不返回数据集? 当存储过程什么都不返回时,我可以重复这个问题。如果它只返回一个与如果查询没有返回任何结果网格,您应该使用 Execute,而不是 Query。
【讨论】:
我认为这些存储过程在返回网格(或空网格)之前检查某些内容时使用了错误的逻辑。这是一个由常规 DbDataReader 支持的语义事物,所以它来到了这一点。恕我直言,Dapper 应该支持这种情况,但我会接受答案。 所以如果我读对了 PROC-A -> 有时会返回 0 条记录;返回 0 条记录时出现此错误;所以为了解决这个问题,我必须做一个额外的调用来做一个计数,以确保当它处于不返回记录的状态时我不会调用这个 proc? @snafu 不,不相关。从选择返回零行与根本不进行选择非常不同。如果它不做选择:执行。以上是关于执行不返回结果的存储过程时引发错误的主要内容,如果未能解决你的问题,请参考以下文章
存储过程在 SSMS 中执行时都返回结果,但从代码执行时只有一个返回结果