我试图从ADO捕获“超时过期”错误.
发生超时时,ADO返回:
Number: 0x80040E31 (DB_E_ABORTLIMITREACHED in oledberr.h)
SQLState: HYT00
NativeError: 0
NativeError为零是有道理的,因为超时不是数据库引擎(即SQL Server)的函数,而是ADO的内部超时机制.
数字(即COM结果)看起来很有用,但oledberr.h
中的definition of DB_E_ABORTLIMITREACHED
说:
Execution stopped because a resource limit was reached. No results were returned.
此错误可能适用于除“超时过期”(某些可能是服务器端)之外的内容,例如限制以下内容的调控器:
> 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
Execution has been aborted because a resource limit has been reached. For example, a query timed out. No results have been returned.
“例如”,意思不是详尽的清单.
更新三
找到了.答案用作答案.
最佳答案 您可以安全地使用HYT00来表示“超时已过期”.以下内容来自Microsoft的
SQLSTATEs参考.它提到了HYT00 SQLSTATE:
The following SQLSTATEs indicate run-time errors or warnings and are good candidates on which to base programming logic. However, there is no guarantee that all drivers return them.
01004 (Data truncated)
01S02 (Option value changed)
HY008 (Operation canceled)
HYC00 (Optional feature not implemented)
HYT00 (Timeout expired)
然后链接到Appendix A: ODBC Error Codes of the ODBC Programmer’s Reference,它记录了SQLSTATE值:
> HYT00超时已过期,也有趣
> HYT01连接超时已过期
所以你可以使用HYT00“Timeout expired”.