如何解决如果 Oracle 存储过程需要更长的时间来执行,C# 应用程序不会超时
我们有一个在供应商端执行 Oracle 存储过程的内部应用程序。一旦存储过程在供应商端完成,它将返回真或假(失败或成功)。
目前我们有这个场景:在Application
表中,我们提到了Oracle存储过程名称、超时设置、参数和其他细节。
- Srno
- SprocName
- TimeoutSetting (秒)---> 5 分钟
- Parameter_1
- Parameter_2 等
C# 应用程序将从表中获取这些详细信息并相应地执行存储过程。
- 最佳情况:执行在超时设置之前完成
- 最坏情况:存储过程执行超出超时设置
因此,在最坏的情况下,假设 abc_sproc
在供应商端运行了大约 5 分 30 秒。但是超时不会在 C# 应用程序端引发,它表明作业仍在运行。在调查过程中,我们发现存储过程在供应商端运行得非常好,没有任何问题,我们必须从外部手动终止作业。
所以我需要您的帮助或建议来改进我的代码,以便我们可以在 C# 应用程序中捕获/提出正确的超时错误。如有任何问题或需要更多信息,请随时提出!
尝试的解决方案:
- 在
OracleException
语句中添加了TimeOutException
和Catch
子句
用于连接 Oracle 的 C# 驱动程序:Oracle.ManagedDataAccess.dll
应用配置:
<configuration>
<configSections>
<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler,Oracle.ManagedDataAccess" />
</configSections>
<oracle.manageddataaccess.client>
<version number="*">
<settings>
<setting name="Disable_Oob" value="on" />
</settings>
</version>
</oracle.manageddataaccess.client>
</configuration>
执行方式:
public int ExecuteData(string connectionName,Procs procDetails) {
int returnValue = -1;
try { //code
returnValue = database.ExecuteSP(procDetails.ProcedureName,lstDataParameters,procDetails.CommandTimeout);
} catch (OracleException ex) {
string exMsg = string.Empty;
switch (ex.Number) {
//Login failed
case 1017:
exMsg = !string.IsNullOrEmpty(ex.Message) ? ex.Message : string.Format("Login failed - " + connectionName);
//Timeout exception
case 1013: {
exMsg = !string.IsNullOrEmpty(ex.Message) ? ex.Message : string.Format("Command timeout failed -" + connectionName
});
}
//Invalid parameters
case 6550:
exMsg = !string.IsNullOrEmpty(ex.Message) ? ex.Message : string.Format("Invalid parameters provided" + connectionName);
default: throw ex;
}
}
catch (TimeoutException ex) {
string exMsg = string.Empty;
exMsg = string.Format("Timeout Exception Occurred - " + connectionName);
}
提前致谢, 惠普
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。