ADO / SQL Server: Какой код ошибки для «истекло время ожидания»? - PullRequest
4 голосов
/ 05 июня 2010

Я пытаюсь перехватить ошибку «Истекло время ожидания» от ADO.

Когда происходит тайм-аут, ADO возвращает:

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

Ноль NativeError имеет смысл, поскольку время ожидания не является функцией механизма базы данных (то есть SQL Server), а является внутренним механизмом времени ожидания ADO.


Number (то есть результат COM) выглядит полезным, но определение DB_E_ABORTLIMITREACHED в oledberr.h говорит:

Выполнение остановлено, поскольку достигнут предел ресурса. Результатов не было.

Эта ошибка может относиться к вещам, кроме " timeout expired " (некоторые потенциально на стороне сервера), например, ограничитель ограничения:

  • загрузка процессора
  • I / O читает / пишет
  • пропускная способность сети

и останавливает запрос.


Последняя полезная часть - SQLState, которая является независимой от базы данных системой кодов ошибок. К сожалению, единственная ссылка для кодов ошибок SQLState, которую я могу найти , не упоминает HYT00.

Что делать? Что делать?


Примечание: я не могу доверять

0x80040E31 (DB_E_ABORTLIMITREACHED)

означает " истекло время ожидания ", больше, чем я мог бы доверять

0x80004005 (E_UNSPECIFIED_ERROR)

означает « Транзакция заблокирована для ресурсов блокировки другого процесса и выбрана в качестве жертвы тупика ».


Мой псевдо-вопрос звучит так: есть ли у кого-нибудь документация о том, что означает SQLState "HYT000"?

И мой реальный вопрос все еще остается: как я могу специально перехватить ADO истекло время ожидания исключение, выданное ADO?

Должен любить вопросы, где разработчик пытается " сделать правильную вещь ", но никто не знает , как сделать правильную вещь. Также надо любить гуглить на DB_E_ABORTLIMITREACHED, и этот вопрос # 9, а MSDN нигде не найти.

Обновление 3

Из справочника OLEdb ICommand.Execute :

DB_E_ABORTLIMITREACHED

Выполнение было прервано, поскольку достигнут предел ресурса. Например, истекло время ожидания запроса. Результаты не возвращены.

" Например ", что означает не исчерпывающий список.


Обновление три

Нашел это. Ответ применяется как ответ.

Ответы [ 2 ]

2 голосов
/ 10 июня 2011

Вы можете безопасно использовать HYT00 для обозначения «Истекло время ожидания» . Следующая информация взята из справки Microsoft SQLSTATE . Упоминается HYT00 SQLSTATE:

Следующие SQLSTATE указывают на ошибки или предупреждения во время выполнения и являются хорошими кандидатами на основу логики программирования. Однако нет гарантии, что все драйверы их вернут.

01004 (усеченные данные)

01S02 (значение параметра изменено)

HY008 (операция отменена)

HYC00 (дополнительная функция не реализована)

HYT00 (истекло время ожидания)

Который затем ссылается на Приложение A: Коды ошибок ODBC Справочника программиста ODBC , в котором заданы значения SQLSTATE:

  • HYT00 Истекло время ожидания, а также интересно
  • HYT01 Истекло время ожидания соединения

Таким образом, вы можете использовать HYT00 для " Истекло время ожидания ".

0 голосов
/ 08 июня 2010

Это не просто -2 или слишком очевидно?

Вы можете сгенерировать это как в SSMS, так и в Ado.net, и мы используем это, чтобы решить, следует ли повторить попытку.

Старый вопрос SO и ссылка и MSDN

...