2013-01-18 48 views
3

我目前在我们的某个项目上使用了dapper,并且始终执行存储过程。在前面的几个方法中,当我们执行的存储过程返回行时,一切正常。执行不返回结果的存储过程时抛出错误

现在我正在面临一个问题,当我试图从存储过程中获取数据时,它会在找到时返回信息。这是一个非常常见的用例(例如,在应用程序上记录用户)。当调用Query方法,以及存储过程不返回任何行,短小精悍抛出与消息的ArgumentException

“当使用多地图API确保您设置的splitOn PARAM如果你有比ID参数其他键名称: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方法真的不是我的情况。另外,由于我没有使用多重映射,所以精巧的异常是误导性的。

任何想法? 谢谢!

+0

是存储过程返回数据集的行数为零还是根本没有返回数据集? – RBarryYoung

+0

当存储过程完全没有返回时,我可以重复这个问题。如果它只返回与对象具有相同结构的空结果集,它就可以正常工作。是否有理由不能返回空数据集而不是什么? – ElvisLives

+0

现在这个过程没有任何回应,我同意这不是一个好的解决方案,但是我们有很多像这样的遗留存储过程。我只是想知道,如果短小精悍不能检查是否没有字段,只是返回默认(T) – rocco

回答

3

如果查询没有返回任何结果网格,则应该使用执行而不是查询。

+0

我认为这些存储过程在返回一个网格(或一个空网格)之前检查某些内容时使用了错误的逻辑。这是一个语义的东西,由一个常规的DbDataReader支持,所以它到了这一点。恕我直言,Dapper应该支持这种情况,但我会接受答案。 – rocco

+0

所以如果我读了这个权利 PROC-A - >有时会返回0条记录; 我得到这个错误,当它返回0记录; 因此,为了解决这个问题,我不得不做一个额外的调用来做一个计数,以确保当它处于不返回记录的状态时,我不会调用此proc。 –

+0

@snafu不,无关。从select中返回零行与根本不做select非常不同。如果它不做选择:执行。 –