gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:29:54 25 4
gpt4 key购买 nike

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

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

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

当然,如果我们执行此 sp,它会返回被零除异常:

Divide by zero error encountered

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

Github Issue #959

最佳答案

我怀疑您的存储过程中的异常发生在第一个结果网格之后。这个问题似乎是 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 (不止这些,但是这些是适用于这种情况的)

关于c# - 如何使用 Dapper 在客户端获取原始 SQL 错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49066853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com