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

问题描述 投票:0回答:2

我想用一个例子来讲述我的案例。

假设我们有存储过程,并且该过程包含这几行 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 问题#959

c# sql-server orm exception dapper
2个回答
3
投票

我怀疑您的存储过程中的异常发生在第一个结果网格之后。这个问题似乎是 Query<T>

QueryFirstOrDefault<T>
 之间的细微差别。您可以使用以下方法解决此问题:

var item = Query<T>(...).FirstOrDefault();

确实以预期的方式抛出。我将调查发生了什么 - 我强烈怀疑这是 CommandBehavior.SingleResult

 提示(dapper 在 
QueryFirstOrDefault
 中使用)防止在观察到第一个网格之后
出现错误。 我建议在 github 上记录问题,以便我/我们可以跟踪它。

编辑:已确认 - 正在

SingleResult

执行此操作;这是一个原始的 ADO.NET 示例来说明,其中

foo
是一个存储过程,它在抛出异常之前执行
select 42;
操作:

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

提示,例如

here
(不仅仅是这些,但这些是适用于本例的提示)


0
投票

BEGIN TRY -- Generate a divide-by-zero error. SELECT ':),ok'; END TRY BEGIN CATCH SELECT ':(,'+ERROR_MESSAGE() END CATCH;

对于数据结果,请查看 multi Query Dapper Doc。

using (var multi = connection.QueryMultiple(sql, new {InvoiceID = 1})) { var invoice = multi.First<T>(); var confirm = multi.ReadSingle<string>(); }

dapperDoc

© www.soinside.com 2019 - 2024. All rights reserved.