0

我有一个奇怪的问题,我正在使用 Dapper 的 ExecuteAsync 扩展调用 Oracle 包方法调用:

var rowsAffected = await Connection.ExecuteAsync(command, parameters, commandType: CommandType.StoredProcedure);

最初我在 Dapper GitHub 项目中发布了这个,但是在检查了扩展方法的代码之后,很明显异常是由 OracleCommand 抛出的,与 Dapper 本身无关,所以我不希望那里有任何反馈,也许一些嘲讽,我希望它不会在相应的回复中实现:-)。这个 Oracle 包方法内部有一个异常处理机制,它处理所有异常并在名为 p_err_msg 的 out 参数中返回任何错误:

EXCEPTION

WHEN OTHERS THEN
v_err_msg := SQLERRM;
v_sql_code := SQLCODE;
v_err_msg := v_err_msg||' '||primaky_key||' '||dbms_utility.format_error_backtrace;
p_err_msg := v_err_msg;
DBMS_OUTPUT.PUT_LINE(p_err_msg);
END;

从任何 Oracle IDE(SQL Developer、TOAD 等)调用 package 方法演示了预期的行为,不会引发异常,而是在 out 变量中返回错误消息。使用相同的参数为相同的方法调用 OracleConnection.ExecuteAsync 会导致在包方法中处理的异常被抛出给客户端。知道为什么会发生这种情况以及如何避免这种情况。它导致了一个问题,因为我们希望确保仅在我们无法执行该方法(连接问题)的任何情况下才抛出异常,而不是在抛出包方法内部的错误时抛出。

4

0 回答 0