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

Ian*_*oyd 6 sql-server timeout exception-handling ado

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

当超时发生时,ADO 返回:

Number:      0x80040E31 (DB_E_ABORTLIMITREACHED in oledberr.h)
SQLState:    HYT00
NativeError: 0
Run Code Online (Sandbox Code Playgroud)

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


Number(即COM HRESULT)看起来有用,但是定义DB_E_ABORTLIMITREACHEDoledberr.h说:

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

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

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

并停止查询。


最后一个有用的部分是SQLState,它是一个独立于数据库的错误代码系统。不幸的是,我能找到的 SQLState 错误代码的唯一参考没有提到HYT00.

该怎么办?做什么?


注意:我不能相信

0x80040E31 (DB_E_ABORTLIMITREACHED)
Run Code Online (Sandbox Code Playgroud)

意思是“超时已过期”,超出了我的信任

0x80004005 (E_UNSPECIFIED_ERROR)
Run Code Online (Sandbox Code Playgroud)

意思是“事务与另一个进程在锁定资源上死锁,并已被选为死锁受害者”。


我的伪问题变成了:有人有关于 SQLState " HYT000" 含义的文档吗?

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

必须喜欢开发人员试图“做正确的事”的问题,但没有人知道如何做正确的事。还必须喜欢谷歌搜索DB_E_ABORTLIMITREACHED,这个问题是#9,找不到 MSDN。

更新 3

来自OLEDb ICommand.Execute 参考

DB_E_ABORTLIMITREACHED

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

例如”,意思是不是一个详尽的列表。


更新三

找到了。答案作为答案应用。

Ian*_*oyd 4

可以放心地使用它HYT00来表示“超时已过期”。以下内容来自微软的SQLSTATEs参考。它提到了HYT00SQLSTATE:

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

01004(数据被截断)

01S02(选项值已更改)

HY008(操作取消)

HYC00(可选功能未实现)

HYT00(超时已到)

然后链接到ODBC 程序员参考 的附录 A:ODBC 错误代码,其中记录了这些SQLSTATE值:

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

因此,您可以使用 HYT00 来表示“超时已过期”。