如何使用Dapper在客户端获取原始SQL错误消息?

时间:2018-03-02 10:03:55

标签: c# sql-server orm exception-handling dapper

我想用一个例子告诉我的情况。

假设我们有存储过程,并且该过程包含这两行SQL代码

BEGIN TRY  
    -- Generate a divide-by-zero error.  
    SELECT 1/0;  
END TRY  
BEGIN CATCH  
    throw
END CATCH;  
GO  

当然,如果我们执行此sp,则返回除以零的异常:

  

遇到零错误

是否可以使用Dapper获取SQL抛出消息? 这里是小巧的请求电话

 var data = sqlConnection.QueryFirstOrDefault<response>(QueryConstants.SpXXX,
 parameters, null, Constants.DAPPER_TIMEOUT, CommandType.StoredProcedure);

我使用的是sql server 2017和Dapper 1.50.4.0

Github Issue #959

1 个答案:

答案 0 :(得分:3)

我怀疑存储过程中的异常是在第一个结果网格后发生的。此问题似乎是User.reset_counters(:badges, :activities)User.left_joins(:badges, :activities) .order(is_verified: :desc, is_admin: :desc) .group("badges.id", "activities.id") .order('COUNT(badges.id) DESC', 'COUNT(activities.id) DESC') 之间的细微差别。您可以使用以下方法解决此问题:

to_sql
以预期的方式投掷。我将调查正在发生的事情 - 我强烈怀疑它是Query<T>提示(在QueryFirstOrDefault<T>中使用的小巧玲珑)在观察到第一个网格后防止错误

我建议在github上记录一个问题,所以我/我们可以跟踪它。

编辑:已确认 - var item = Query<T>(...).FirstOrDefault(); 正在执行此操作;这里是一个原始的ADO.NET示例来说明,其中CommandBehavior.SingleResult是在抛出异常之前执行QueryFirstOrDefault的存储过程:

SingleResult

此处的修复可能只是为了删除所有foo提示,例如here(不仅仅是那些,但这些是适用于这种情况的那些)