我想用一个例子来讲述我的案例。
假设我们有存储过程,并且该过程包含这几行 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
我怀疑您的存储过程中的异常发生在第一个结果网格之后。这个问题似乎是 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(不仅仅是这些,但这些是适用于本例的提示)
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>();
}