![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Код ошибки Timeout expired в MS SQL Server. [MSSQL]
Дмитрий Тимохов © (2011-04-25 15:16:00)Добрый день!
Ситуация такова:
1. Использую базу данных MS SQL Server.
2. Для доступа использую ADODB.
3. Использую провайдер SQLOLEDB
Проблема:
1. Хочу отлавливать момент, когда ADODB.Command завершается с ошибкой "Timeout expired" для целей последующей отладки подобных ситуаций.
Что не получается:
1. Не могу понять, как по ADODB.Error понять, что произошла эта ошибка (кроме как анализировать ADODB.Error.Description - но это же несерьезно).
2. Не могу понять, откуда вообще брать коды ошибок, и что значат на самом деле ADODB.Error.NativeError и ADODB.Error.SqlState.
Что делал:
1. Поймал ошибку в runtime.
Description: "Timeout expired"
Native error: "0"
Source: "Microsoft OLE DB Provider for SQL Server"
SQLState: "HYT00"
2. Я подумал, что HYT00 это код ошибки из Microsoft OLE DB Provider for SQL Server. Но не нашел такого.
3. Потому я подумал, что это может код ошибки из стандарта SQL. Но там вроде согласно http://msdn.microsoft.com/en-us/library/aa937531%28SQL.80%29.aspxкодом ошибки для Timeout expired является S1T00
Вопросы:
1. Какая ошибка то должна быть?
2. Правильно я понимаю, что есть:
а) Ошибки ADODB
б) Ошибки сервера
в) Ошибки OLEDB Provider'а
Если да, то то где их всех отлавливать: в NativeError или SQLState?
3. Где взять списки возможных ошибок?
OW (2011-04-26 11:11:00) [21]
> меня интересует одно - как по кодам ошибок понять, что это
> именно timeout expired. наиболее подходящее SQLState, возможные
> варианты которого вроде как прописаны в SQL-92.
>
> меня удивляет почему доке одна ошибка, а по факту другая.
>
> все...
говорю же
ты позвонил на справочную, спросил номер загса/морга и сразу повесил трубку.
> timeout - это твое решение, т.е. ты, клиент, перестал ждать.
и что должен тебе сказать сервер?
Дмитрий Тимохов (2011-04-26 10:49:00) [22]офигеть )))
выполните запрос select * from SomeTable where SomeField like '%dfdfssd%'
если в таблице 10000000 записей, а таймаут ADODB.Command.Timout равен 1 сек.
вызове Execute свалится с сообщением timeout expired.
меня интересует одно - как по кодам ошибок понять, что это именно timeout expired. наиболее подходящее SQLState, возможные варианты которого вроде как прописаны в SQL-92.
меня удивляет почему доке одна ошибка, а по факту другая.
все...
Тут вопрос нельзя свой удалить?
Дмитрий Тимохов (2011-04-26 10:47:00) [23]не туда все зашло как-то.
вопрос решил, проверяю все коды, которые удалось получить ПЛЮС S1T00, который прописан в MSDN.
вопросов больше не имею.
OW (2011-04-26 10:46:00) [24]тоже не понимаю немного
timeout - это твое решение, т.е. ты, клиент, перестал ждать.
Чего же мы хотим тогда от сервера?
sniknik (2011-04-26 10:07:00) [25]> Т.е. по кодам ошибок нельзя однозначно понять, что случился timeout.
> ... IntToStr(Number { -2147217871}) ...
> вернее не так, ошибся
> EOleException : Timeout expired
> EOleException.ErrorCode : -2147217871
> 0: -2147217871: Timeout expired
ну прям жуткая неоднозначность... везде разный код... (сарказм).
не ошибайся, и все.
> на сути вопроса.
какой сути? таймаут означает что ответа не дождались так? т.е. ты туда АУ!, а ответ тишина... долго, долго, надоело = таймаут.
почему ты ждешь расшифровки ошибки от сервера (или кого? ODBC который просто рядом где то, может быть... а может и не установлен) если он/в случае когда не отвечает?
та ошибка на которую ты "упираешь" это таймаут в выполнении чего то самим сервером/ODBC (пофигу от кого, т.к. не использую), а смотришь на таймаут от сервера. разница однако.
чтобы получить "ту" сделай в запросе длительное обращение куда нибудь "вне", например в другой сервер, а в компонентах поставь 0 (ждать до упора).
> Надо анализировать, я полагаю, SQLState
т.е. неважно, что это ODBC (у которого тоже есть таймауты на выполнение чего то), т.е. 3й вариант... (ODBC это вообще набор функций, по сути, ответ который OLEDB скорее всего преобразует к своему виду) ты работаешь прямо с dll-ками ODBC?
и говоришь
> Да, я это понимаю ...
и тем не менее "полагаешь". ну так полагай дальше, зачем нас спрашивать, если сам "лучше всех знаешь"?
Дмитрий Тимохов (2011-04-26 09:40:00) [26]Я вообще к чему... В NativeError и ErrorCode нет информации о timeout expired (кроме Description, конечно). Т.е. по кодам ошибок нельзя однозначно понять, что случился timeout.
Надо анализировать, я полагаю, SQLState. Но тут нестыковка - MSDN сказан один код, а по факту другой.
Я с вопросом повторяюсь уже - виноват. Но хочу просто акцентировать внимание на сути вопроса. Вот.
Дмитрий Тимохов (2011-04-26 09:38:00) [27]-2147217871 - это
//
// MessageId: DB_E_ABORTLIMITREACHED
//
// MessageText:
//
// Execution aborted because a resource limit has been reached; no
// results have been returned
//
DB_E_ABORTLIMITREACHED = HResult($80040E31);
{$EXTERNALSYM DB_E_ABORTLIMITREACHED}
из "c:\Program Files\CodeGear\RAD Studio\5.0\source\Win32\db\OleDB.pas"
Дмитрий Тимохов (2011-04-26 09:37:00) [28]вернее не так, ошибся
EOleException : Timeout expired
EOleException.ErrorCode : -2147217871
0: -2147217871 : Timeout expired
Дмитрий Тимохов (2011-04-26 09:33:00) [29]Да, я это понимаю, что ошибки OLEDB provider и ODBC return code разные вещи.
На странице http://msdn.microsoft.com/en-us/library/aa937531%28SQL.80%29.aspxсказано, что эти пятизначные коды вообще коды из SQL-92.
Выдача по твоему коду такая
EOleException : Timeout expired
EOleException.ErrorCode : -21472178710:
-2147217871 : Timeout expired
sniknik (2011-04-25 20:09:00) [30]> в) Ошибки OLEDBProvider'а
а при чем здесь тогда " ODBCReturn code"?
sniknik (2011-04-25 20:05:00) [31]
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
try
ADOCommand1.Execute;
Memo1.Lines.Add('Ok');
except
on E: Exception do begin
Memo1.Lines.Add(E.ClassName + ' : ' + E.Message);
if E is EOleException then
Memo1.Lines.Add('EOleException.ErrorCode : ' + IntToStr(EOleException(E).ErrorCode));
with ADOConnection1.Errors do
for i:= 0 to ADOConnection1.Errors.Count-1 do
with Item[i] do
Memo1.Lines.Add(IntToStr(NativeError {0}) + ':' +IntToStr(Number {-2147217871}) + ' : ' + Description);
end;
end;
end;
Дмитрий Тимохов (2011-04-25 19:15:00) [32]Я пока проверяю SQLState и на равенство HYT00 и на S1T00... (по союзу OR, конечно, если что...)
Вроде работает. Но удивляет, почему в доке одно (т.е. S1T00), а по факту HYT00...
Может кто объяснит это? Возможно, что я не верно понимаю топологию кодов ошибок...
Дмитрий Тимохов (2011-04-25 19:14:00) [33]блин ))) ты и MSDN так читаешь)))))
я хочу услышать компетентный ответ, как МНЕ ОДНОЗНАЧНО ПОНЯТЬ, что выполнение метода ADODB.Command.Execute закончилось именно в ошибкой TIMEOUT EXPIRED, а не любой другой.
Ega23 (2011-04-25 17:46:00) [34]
> хороший совет. все равно, что - terminateprocess непокорным
> делать.
Не, ну а что ты хочешь? Как можно оценить продолжительность выполнения запроса и выставить нужный timeout на конкретномсервере? Может быть дохлое железо, может быть много подключений, может быть старая индексация таблиц, может быть загрузка сети. Да что угодно может быть.
Дмитрий Тимохов (2011-04-25 17:41:00) [35]хороший совет. все равно, что - terminateprocess непокорным делать. ))
Ega23 (2011-04-25 17:32:00) [36]
> специально поставил таймаут на минимум - многие отчеты вываливаются
> по таймауту.
Ставь в 0, мало ли какой там отчет, или какая активность сервера?
Вполне может быть, что решается через какой-нитьDBCC DBREINDEX
Дмитрий Тимохов (2011-04-25 17:29:00) [37]да запрос то не причем.
я просто пытаюсь наладить логирование плохих запросов.
специально поставил таймаут на минимум - многие отчеты вываливаются по таймауту.
хочу понять, как определять, что это таймаут
OW (2011-04-25 17:22:00) [38]блокировки, видимо
что за запрос?
Ega23 (2011-04-25 17:21:00) [39]
> HResult($80040E31);
Вот http://social.msdn.microsoft.com/forums/en-US/sqldataaccess/thread/4baafb7f-8eae-4ca8-90fc-2a4273c0fd57/
(вместе с комментариями)
Ещё тут http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout.aspx
Дмитрий Тимохов (2011-04-25 17:18:00) [40]Перефразирую вопрос - как бы вы гарантированно отлавливали timeout?