我想用一个例子来说明我的情况。
假设我们有存储过程,该过程包含以下几行SQL代码
BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
throw
END CATCH;
GO 当然,如果我们执行这个sp,它返回除以零异常:
除以所遇到的误差
是否有可能在Dapper中使用SQL抛出消息?这是dapper请求调用
var data = sqlConnection.QueryFirstOrDefault<response>(QueryConstants.SpXXX,
parameters, null, Constants.DAPPER_TIMEOUT, CommandType.StoredProcedure);我正在使用sql server 2017和Dapper 1.50.4.0
发布于 2018-03-02 10:18:46
我怀疑存储过程中的异常发生在第一个结果网格之后。这个问题似乎是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提示,例如这里 (不仅仅是这些提示,但这些都适用于本例)
https://stackoverflow.com/questions/49066853
复制相似问题