Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.03.29;
Скачать: CL | DM;

Вниз

Код ошибки Timeout expired в MS SQL Server.   Найти похожие ветки 

 
Дмитрий Тимохов   (2011-04-25 15:16) [0]

Добрый день!

Ситуация такова:
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. Где взять списки возможных ошибок?


 
Ega23 ©   (2011-04-25 15:48) [1]


> 1. Какая ошибка то должна быть?

Походу EOleException


>  в) Ошибки OLEDB Provider"а

http://msdn.microsoft.com/en-us/library/ms190181.aspx


> 3. Где взять списки возможных ошибок?

Сейчас под рукой нет, см. в msdn и bol.
Вообще я когда-то давно что-то подобное ловил, там у класса исключения ErrorCode должен быть.


 
Ega23 ©   (2011-04-25 15:51) [2]

Самое простое: тестовый проект, коннект к базе, отрубаешь сервер и вызываешь какой-нить запрос.
try
 ADODataSet.Open;
except on E: Exception do
 ShowMessage(E.ClassName);
end;

Вроде бы должен EOleError вернуть, у него код определённый есть. Выщучивай код и ищи в MSDN по нему (как в dec, так и в hex).


 
Дмитрий Тимохов   (2011-04-25 15:55) [3]

Олегыч, ну я делал все это. Что нашел, то привел в вопросе.
Почему вроде должен быть код ошибки в SQLState S1T00, а на самом деле HYT00...


 
Ega23 ©   (2011-04-25 16:19) [4]


> Олегыч, ну я делал все это. Что нашел, то привел в вопросе.


Значит не так понял вопрос.

ЕМНИП, там две разных ошибки. Одна - собственно сам процесс коннекта. Вторая - длительное выполнение команды.
Возможно это именно та разница.


 
Дмитрий Тимохов   (2011-04-25 16:21) [5]

Коннект нормальный. Я про выполнение запроса уже с помощью ADODB.Command.Execute. Меня интересует этот таймаут


 
Ega23 ©   (2011-04-25 16:28) [6]


> Коннект нормальный. Я про выполнение запроса уже с помощью
> ADODB.Command.Execute. Меня интересует этот таймаут


ааа.
тогда см. ADODB.Command.CommandTimeout


 
Дмитрий Тимохов   (2011-04-25 16:50) [7]

Олегыч, ты вопрос то прочти.

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


 
OW ©   (2011-04-25 17:02) [8]

try
   
 except
  on E:Exception do
  begin
     EOleException(E).ErrorCode;  // comobj
  end;
 end;

какой код?


 
Дмитрий Тимохов   (2011-04-25 17:08) [9]


> какой код?

//
// MessageId: DB_E_ABORTLIMITREACHED
//
// MessageText:
//
//  Execution aborted because a resource limit has been reached; no
//  results have been returned
//
 DB_E_ABORTLIMITREACHED               = HResult($80040E31);


 
Дмитрий Тимохов   (2011-04-25 17:18) [10]

Перефразирую вопрос - как бы вы гарантированно отлавливали timeout?


 
Ega23 ©   (2011-04-25 17:21) [11]


>  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


 
OW ©   (2011-04-25 17:22) [12]

блокировки, видимо
что за запрос?


 
Дмитрий Тимохов   (2011-04-25 17:29) [13]

да запрос то не причем.
я просто пытаюсь наладить логирование плохих запросов.
специально поставил таймаут на минимум - многие отчеты вываливаются по таймауту.

хочу понять, как определять, что это таймаут


 
Ega23 ©   (2011-04-25 17:32) [14]


> специально поставил таймаут на минимум - многие отчеты вываливаются
> по таймауту.


Ставь в 0, мало ли какой там отчет, или какая активность сервера?
Вполне может быть, что решается через какой-нить DBCC DBREINDEX


 
Дмитрий Тимохов   (2011-04-25 17:41) [15]

хороший совет. все равно, что - terminateprocess непокорным делать. ))


 
Ega23 ©   (2011-04-25 17:46) [16]


> хороший совет. все равно, что - terminateprocess непокорным
> делать.


Не, ну а что ты хочешь? Как можно оценить продолжительность выполнения запроса и выставить нужный timeout на конкретном сервере? Может быть дохлое железо, может быть много подключений, может быть старая индексация таблиц, может быть загрузка сети. Да что угодно может быть.


 
Дмитрий Тимохов   (2011-04-25 19:14) [17]

блин ))) ты и MSDN так читаешь)))))

я хочу услышать компетентный ответ, как МНЕ ОДНОЗНАЧНО ПОНЯТЬ, что выполнение метода ADODB.Command.Execute закончилось именно в ошибкой TIMEOUT EXPIRED, а не любой другой.


 
Дмитрий Тимохов   (2011-04-25 19:15) [18]

Я пока проверяю SQLState и на равенство HYT00 и на S1T00... (по союзу OR, конечно, если что...)

Вроде работает. Но удивляет, почему в доке одно (т.е. S1T00), а по факту HYT00...

Может кто объяснит это? Возможно, что я не верно понимаю топологию кодов ошибок...


 
sniknik ©   (2011-04-25 20:05) [19]

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;


 
sniknik ©   (2011-04-25 20:09) [20]

> в) Ошибки OLEDB Provider"а
а при чем здесь тогда "ODBC Return code"?


 
Дмитрий Тимохов   (2011-04-26 09:33) [21]

Да, я это понимаю, что ошибки 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


 
Дмитрий Тимохов   (2011-04-26 09:37) [22]

вернее не так, ошибся

EOleException : Timeout expired
EOleException.ErrorCode : -2147217871
0: -2147217871 : Timeout expired


 
Дмитрий Тимохов   (2011-04-26 09:38) [23]

-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:40) [24]

Я вообще к чему... В NativeError и ErrorCode нет информации о timeout expired (кроме Description, конечно). Т.е. по кодам ошибок нельзя однозначно понять, что случился timeout.

Надо анализировать, я полагаю, SQLState. Но тут нестыковка - MSDN сказан один код, а по факту другой.

Я с вопросом повторяюсь уже - виноват. Но хочу просто акцентировать внимание на сути вопроса. Вот.


 
sniknik ©   (2011-04-26 10:07) [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?
и говоришь
> Да, я это понимаю ...
и тем не менее "полагаешь". ну так полагай дальше, зачем нас спрашивать, если сам "лучше всех знаешь"?


 
OW ©   (2011-04-26 10:46) [26]

тоже не понимаю немного
timeout  - это твое решение, т.е. ты, клиент, перестал ждать.
Чего же мы хотим тогда от сервера?


 
Дмитрий Тимохов   (2011-04-26 10:47) [27]

не туда все зашло как-то.

вопрос решил, проверяю все коды, которые удалось получить ПЛЮС S1T00, который прописан в MSDN.

вопросов больше не имею.


 
Дмитрий Тимохов   (2011-04-26 10:49) [28]

офигеть )))

выполните запрос select * from SomeTable where SomeField like "%dfdfssd%"

если в таблице 10000000 записей, а таймаут ADODB.Command.Timout равен 1 сек.

вызове Execute свалится с сообщением timeout expired.

меня интересует одно - как по кодам ошибок понять, что это именно timeout expired. наиболее подходящее SQLState, возможные варианты которого вроде как прописаны в SQL-92.

меня удивляет почему доке одна ошибка, а по факту другая.

все...

Тут вопрос нельзя свой удалить?


 
OW ©   (2011-04-26 11:11) [29]


> меня интересует одно - как по кодам ошибок понять, что это
> именно timeout expired. наиболее подходящее SQLState, возможные
> варианты которого вроде как прописаны в SQL-92.
>
> меня удивляет почему доке одна ошибка, а по факту другая.
>
> все...


говорю же

ты позвонил на справочную, спросил номер загса/морга и сразу повесил трубку.


> timeout  - это твое решение, т.е. ты, клиент, перестал ждать.

и что должен тебе сказать сервер?


 
OW ©   (2011-04-26 11:12) [30]


> Тут вопрос нельзя свой удалить?

нет, а зачем?
мне тоже интересно, например.


 
OW ©   (2011-04-26 11:18) [31]

читая Николая, и прикидывая:
если на сервере есть настройка исполнять не более стольких то, а у тебя бесконечность - тогда ты вправе ожидать ошибку из доки.
Сейчас ты сам не хочешь ждать, так почему же рассчитываешь на ошибку из доки?


 
Ega23 ©   (2011-04-26 11:23) [32]


> выполните запрос select * from SomeTable where SomeField
> like "%dfdfssd%"
> если в таблице 10000000 записей, а таймаут ADODB.Command.
> Timout равен 1 сек.
> вызове Execute свалится с сообщением timeout expired.


Дим, у тебя не капитан, случаем, звание? Естественно свалиться, к гадалке не ходи.


 
Дмитрий Тимохов   (2011-04-26 13:27) [33]

Братцы... вопрос был другой. Почему в доке одно, а по факту другое и это другое я не могу найти в списке ошибок.

МНЕ НАДО в моем обработчике ошибок понимать какая ошибка произошла. МНЕ НЕ НАДО выполнять настройку timeout"а, также мне не надо бороться с ним. МНЕ НАДО только то, что я сказал.

Всё)


 
Ega23 ©   (2011-04-26 13:49) [34]

Да поставь ты уже
if Pos("timeout expired") <> 0 then Log
:)


 
Дмитрий Тимохов   (2011-04-26 14:03) [35]


> Ega23 ©   (26.04.11 13:49) [34]
>
> Да поставь ты уже
> if Pos("timeout expired") <> 0 then Log
> :)


А лучше так:
if Pos(TranslateToEveryLanguageInTheWorld("timeout expired")) <> 0 then Log

)))

Ну я проверяю, все что могу.

Вообще просто такое несоответствие подрывает мою веру в доку.
Вообще, больная эта тема - коды ошибок.

В HTTP вроде еще ничего. А так, стройности нет как-то...


 
Вариант   (2011-04-26 15:01) [36]


> Дмитрий Тимохов   (26.04.11 14:03) [35]

http://msdn.microsoft.com/en-us/library/ms716412%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/ms714687(v=VS.85).aspx


 
Дмитрий Тимохов   (2011-04-26 15:37) [37]


> Вариант   (26.04.11 15:01) [36]
>
>
> > Дмитрий Тимохов   (26.04.11 14:03) [35]
>


Угу, спасибо. Вроде полезно!


 
Дмитрий Тимохов   (2011-04-26 15:40) [38]


> Вариант   (26.04.11 15:01) [36]


Спасибо!! Тебе!!!

Вот что я искал! Это ссылка с твоей первой ссылки:

http://msdn.microsoft.com/en-us/library/ms712451%28VS.85%29.aspx

Как раз HYT00 и S1T00 это одно и тоже только для разных версий ODBC


 
Дмитрий Тимохов   (2011-04-26 16:08) [39]

ЕЩЕ ВОПРОС

Задаю тут, т.к. новый вопрос в общем связан с топиком.

Вопрос несколько общий.

ВОПРОС 1. Скажите, пожалуйста, как взаимосвязаны ODBC, OLE DB и АDO?

Поясню:
1. АDO использует в ConnectionString провайдер OLEDB для доступа SQLOLEDB.
2. А ODBC тут каким боком? Он лежит в основе OLE DB? Или OLE DB сам обращается к БД? Я так понимаю, что ODBC самая низкоуровневая библиотека работы с БД, а на ней уже строится все остальное - OLE DB и ADO.

Если я правильно предполагаю, и в основе ADO лежит ODBC, то возникает ВОПРОС 2. Как понять, какая версия ODBC используется в основе ADO?


 
Anatoly Podgoretsky ©   (2011-04-26 16:34) [40]

ODBC не имеет никакого отношения к SQLOLEDB


 
Дмитрий Тимохов   (2011-04-26 16:37) [41]

Почему тогда выводятся ошибки ODBC, когда я пользуюсь SQLOLEDB из ADODB?


 
OW ©   (2011-04-26 16:48) [42]

http://www.sql.ru/articles/mssql/2005/122703ADO.shtml


 
sniknik ©   (2011-04-26 20:37) [43]

> Почему тогда выводятся ошибки ODBC, когда я пользуюсь SQLOLEDB из ADODB?
а почему в дельфи есть ADOTable/ADOQuery? хотя к ADO они не имеют вообще никакого отношения, а вот для BDE "родные".
для совместимости, и разных менеджерских "заморочек" (чтобы при "продвижении" продукта был аргумент "да вам ничего даже переделывать не нужно будет! замените одно на другое да и все..." ).

тип/провайдер ошибки идет в NativeError, по сравнивай его с разными.


 
sniknik ©   (2011-04-26 20:50) [44]

SQLState Property
     
Remarks
Use the SQLState property to read the five-character error code that the provider returns when an error occurs during the processing of an SQL statement. For example, when using the Microsoft OLE DB Provider for ODBC with a Microsoft SQL Server database, SQL state error codes originate from ODBC, based either on errors specific to ODBC or on errors that originate from Microsoft SQL Server, and are then mapped to ODBC errors. These error codes are documented in the ANSI SQL standard, but may be implemented differently by different data sources.


 
Anatoly Podgoretsky ©   (2011-04-26 21:08) [45]

> sniknik  (26.04.2011 20:37:43)  [43]

Ну это костыли от Борланд, они бедненькие думадт, что мы не сможем осилить
TAdoDataset


 
sniknik ©   (2011-04-26 21:29) [46]

> Ну это костыли от Борланд,
ну, а там костыли от Мелкософт... (если конечно у него реально нет ODBC провайдера в связке подключения, но коды его ошибок есть).
кто то значит захотел совместимости, единообразия, "позаботился" о нас... подумал что мы не сможем осилить нового списка ошибок... и... вуаля! транслирование старого и неполного с точки зрения нового есть, а полного списка новых нет ;(.


 
Дмитрий Тимохов   (2011-04-26 23:49) [47]

Всех благодарю. Со своей прикладной задачей разобрался.


> sniknik ©   (26.04.11 20:50) [44]

Откуда цитата?


 
sniknik ©   (2011-04-27 00:15) [48]

из хелпа ADO


 
Дмитрий Тимохов   (2011-04-27 01:35) [49]

Итог понятный. Серебряной пули нет. Надо в части кодов ошибок разбираться по месту.



Страницы: 1 2 вся ветка

Текущий архив: 2015.03.29;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.005 c
4-1271301738
Interesting
2010-04-15 07:22
2015.03.29
Температура проца


2-1391642421
Drowsy
2014-02-06 03:20
2015.03.29
TibDataSet фильтруется через Filter,Filtered?


15-1407258646
Вова
2014-08-05 21:10
2015.03.29
Си в Делфи


15-1407478480
AScript
2014-08-08 10:14
2015.03.29
ActionScript


15-1407699293
Дмитрий СС
2014-08-10 23:34
2015.03.29
Библиотека словоформ