首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Dapper在客户端获取原始SQL错误消息?

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

Stack Overflow用户
提问于 2018-03-02 10:03:55
回答 1查看 2.5K关注 0票数 5

我想用一个例子来说明我的情况。

假设我们有存储过程,该过程包含以下几行SQL代码

代码语言:javascript
复制
BEGIN TRY  
    -- Generate a divide-by-zero error.  
    SELECT 1/0;  
END TRY  
BEGIN CATCH  
    throw
END CATCH;  
GO  

当然,如果我们执行这个sp,它返回除以零异常:

除以所遇到的误差

是否有可能在Dapper中使用SQL抛出消息?这是dapper请求调用

代码语言:javascript
复制
 var data = sqlConnection.QueryFirstOrDefault<response>(QueryConstants.SpXXX,
 parameters, null, Constants.DAPPER_TIMEOUT, CommandType.StoredProcedure);

我正在使用sql server 2017和Dapper 1.50.4.0

Github第959期

EN

回答 1

Stack Overflow用户

发布于 2018-03-02 10:18:46

我怀疑存储过程中的异常发生在第一个结果网格之后。这个问题似乎是Query<T>QueryFirstOrDefault<T>之间一个微妙的区别。您可以通过以下方法解决这个问题:

代码语言:javascript
复制
var item = Query<T>(...).FirstOrDefault();

这确实符合预期的方式。我将调查正在发生的事情--我强烈怀疑是CommandBehavior.SingleResult提示( dapper在QueryFirstOrDefault中使用)防止了在第一个网格被观察后发生的错误。

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

编辑:确认-这是SingleResult做的;下面是一个原始的ADO.NET示例来说明,其中foo是一个在抛出异常之前执行select 42;的存储过程:

代码语言:javascript
复制
using (var cmd = conn.CreateCommand())
{
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "foo";

    // if SingleResult is omitted, the error is observed
    // using (var reader = cmd.ExecuteReader())

    // if SingleResult is specified, the error is not observed
    using (var reader = cmd.ExecuteReader(CommandBehavior.SingleResult))
    {
        do
        {
            while (reader.Read()) { } // ignore the rows in the grid
        } while (reader.NextResult());
    }
}

这里的修正可能是我只删除所有的SingleResult提示,例如这里 (不仅仅是这些提示,但这些都适用于本例)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49066853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档