ADO / SQL Server:“超时过期”的错误代码是什么?

时间:2010-06-04 21:28:08

标签: sql-server exception-handling timeout ado

我正试图从ADO中捕获“超时过期”错误。

发生超时时,ADO返回:

Number:      0x80040E31 (DB_E_ABORTLIMITREACHED in oledberr.h)
SQLState:    HYT00
NativeError: 0

NativeError是有道理的,因为超时不是数据库引擎(即SQL Server)的函数,而是ADO的内部超时机制。


Number(即COM hresult)看起来很有用,但definition of DB_E_ABORTLIMITREACHED中的oledberr.h说:

  

执行已停止,因为已达到资源限制。没有返回任何结果。

此错误可能适用于“超时过期”(某些可能是服务器端)之外的内容,例如限制的调控器:

  • CPU使用率
  • I / O读/写
  • 网络带宽

并停止查询。


最后一个有用的部分是SQLState,它是一个与数据库无关的错误代码系统。很遗憾,唯一的reference for SQLState error codes i can find没有提到HYT00

怎么办? 怎么办?


注意:我不能相信

0x80040E31 (DB_E_ABORTLIMITREACHED)

表示“超时已过期”,不再是我信任的

0x80004005 (E_UNSPECIFIED_ERROR)

表示“事务已在锁定资源上与另一个进程陷入僵局,并被选为死锁受害者”。


我的伪问题变成:有没有人有关于SQLState“HYT000”的含义的文档?

我的真正问题仍然存在:如何专门捕获ADO抛出的ADO 超时过期异常?

喜欢开发人员试图“做正确的事情”的问题,但没有人知道如何做正确的事情。还要喜欢谷歌搜索DB_E_ABORTLIMITREACHED,这个问题是#9,MSDN无处可寻。

更新3

来自OLEdb ICommand.Execute reference

  

DB_E_ABORTLIMITREACHED

     

执行已中止,因为已达到资源限制。例如,查询超时。没有返回任何结果。

例如”,意思不是详尽的清单。


更新三

找到它。答案用作答案。

2 个答案:

答案 0 :(得分:2)

可以安全地使用HYT00来表示“超时已过期”。以下内容来自Microsoft的SQLSTATEs参考。它提到了HYT00 SQLSTATE:

  

以下SQLSTATE指示运行时错误或警告,并且是编程逻辑基础的良好候选者。但是,并不能保证所有司机都会退回。

     

01004(数据被截断)

     

01S02(选项值已更改)

     

HY008(取消操作)

     

HYC00(未实施可选功能)

     

HYT00(超时已到期)

然后链接到Appendix A: ODBC Error Codes of the ODBC Programmer's Reference,其中记录了SQLSTATE值:

  • HYT00超时已过期,有趣的是
  • HYT01连接超时已过期

因此,您可以使用HYT00进行“ Timeout expired ”。

答案 1 :(得分:0)

不只是-2还是太明显了?

您可以在SSMS和Ado.net中生成此内容,我们会使用它来决定是否重试。

Old SO Question以及linkMSDN