Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отмена выполнения запроса


Страницы:   1 2 3 4

DmitriyG. ©   (2008-03-11 16:13:00) 

Можно ли для MSSQL 2005 сделать отмену выполнения запроса?
Вопрос мне кажется наболевший, но ответа нигде нет...


DmitriyG.   (2008-03-18 11:11:00) [1]

Посмотрел. Впринципе работает также как и у меня, только у Вас после снятия некоторых запросов выдается
"Cannot perform this operation on a closed dataset"
И проблема не решена: при выборке большого кол-ва записей и отмене запроса данные по сети передаются (30% загрузки)!!!! Причем при повторном выполнении запроса сеть становится занятой на 60%. При отмене из QA все нормально.


Anatoly Podgoretsky   (2008-03-18 04:37:00) [2]


> Для того, чтобы это проверить, достаточно побаловаться с
> QA - там есть кнопка останова. Он же как-то это делает,
> а ? Или он не джетом пользуется ?

Он пользуется ODBC


DmitriyG.   (2008-03-18 00:16:00) [3]

Сегодня поздно завтра проверю, отмену на большой базы для MSSQL


sniknik   (2008-03-17 22:36:00) [4]

> Правда, это "весело" не распространяется на хранимки, в которых рекурсия - там надо трохе обождать, пока сервер "выйдет из транса" ;)
проверь в тесте [61], не должен ждать. ждешь ты, имхо, потому, что cancel "оберточный" используешь, а там вроде сделано с ожиданием ответа, специально, типа гарантировано. а QA бросает все на "произвол судьбы" не ожидая подтверждений.

> Или он не джетом пользуется ?
естественно не jet-ом, jet это access, а не mssql. но вообще чем бы он там не пользовался, все это можно повторить чисто на ADO (может им и пользуется, хотя он и ODBC*-шную dll подключает... может и его тоже, вперемешку). ну, более менее повторить, трудности наверняка будут, но пока я их не вижу (и они будут не там где могут подумать... а например в отсутствии грида для отображения, т.к. он явно работает с датасетами с серверным курсором, дельфишный такое отображать не может. и т.д. и т.п. неясно пока не столкнешся).


MsGuns   (2008-03-17 21:02:00) [5]

С ураклом не работал, но, думаю, что он тут не при чем - вся закавыка в неправильном (некорректном) использовании ADO.
У меня с мсскл все весело снимается. Правда, это "весело" не распространяется на хранимки, в которых рекурсия - там надо трохе обождать, пока сервер "выйдет из транса" ;)

Для того, чтобы это проверить, достаточно побаловаться с QA - там есть кнопка останова. Он же как-то это делает, а ? Или он не джетом пользуется ?


Petr V. Abramov   (2008-03-17 18:01:00) [6]


> ANB   (17.03.08 17:56) [74]

OCI-трассировщиком глянь, че он пытается делать


ANB   (2008-03-17 17:56:00) [7]

Во. Нашел. Cancel коннекту согласно доке должен помочь. Но не помогает.


ANB   (2008-03-17 17:50:00) [8]


procedure TDataSet.Cancel;

 procedure CancelNestedDataSets;
 var
   I: Integer;
 begin
   if Assigned(FNestedDataSets) then
     for I := 0 to FNestedDataSets.Count - 1 do
       with TDataSet(FNestedDataSets[I]) do
         if Active then Cancel;
 end;

var
 DoScrollEvents: Boolean;
begin
 case State of
   dsEdit, dsInsert:
     begin
       CancelNestedDataSets;
       DataEvent(deCheckBrowseMode, 0);
       DoBeforeCancel;
       DoScrollEvents := (State = dsInsert);
       if DoScrollEvents then DoBeforeScroll;
       UpdateCursorPos;
       InternalCancel;
       FreeFieldBuffers;
       SetState(dsBrowse);
       Resync([]);
       DoAfterCancel;
       if DoScrollEvents then DoAfterScroll;
     end;
 end;
end;

Думал, что то попутал, но все верно. Cancel набору данных - тупо отмена редактирования/вставки.
Cancel коннекту уходит в вызов метода АДО, но никакого эффекта не дает - запрос висит.


ANB   (2008-03-17 15:22:00) [9]


> а дельфу подымать лень

У меня отчет уже третий час колбасит - не могу в делфу залезть.


Petr V. Abramov   (2008-03-17 15:04:00) [10]


> ANB   (17.03.08 14:55) [70]


> Не, у нас админы че то настроили - больше суток сессия не
> висит.

да нет такого параметра "сколько висеть" :)
тут все на везении.

> Похоже, АДО не знает про OCIBreak() (да и откуда ? универсал
> же).

да такой же это универсал, как BDE, все равно в конце концов на OCI основано, прекрасно трассируется любым OCI-трассировщиком.
Кстати, ради интерса посмотри, что оно пытается делать при Cancel, мне самому интересно стало, а дельфу подымать лень, в VS разбираться с ADO - тем более :)


ANB   (2008-03-17 14:55:00) [11]


> было дело и неделю висела, пока не orakill`ом не застрелил.

Не, у нас админы че то настроили - больше суток сессия не висит.


> так тоже часа через 2 снимется :)

Там - это в АДО ? Ни фига. Мой запрос отрабатывает 2 мин. В девелопере - снимается менее чем через секунду.
Похоже, АДО не знает про OCIBreak() (да и откуда ? универсал же).


Petr V. Abramov   (2008-03-17 14:19:00) [12]


> ANB   (17.03.08 14:07) [68]


> из девелопера, тоада, через ДОА и ОДАК - без проблем все
> нормально снимается.

ну волшебства тут никакого
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14250/oci16msc007.htm#sthref3500
как ее там ADO использует - другой вопрос.

> Да, иногда подвисает и не снимается ничем, даже сессия не
> убивается.

так тоже часа через 2 снимется :)


>  А уж на следующий день ее по любому обычно уже нету.

было дело и неделю висела, пока не orakill`ом не застрелил.


ANB   (2008-03-17 14:07:00) [13]


> там не асинхронка не доделана, а вообще прерывание выполнения
> запроса любым способом

из девелопера, тоада, через ДОА и ОДАК - без проблем все нормально снимается. Я ж корректный случай взял. Да, иногда подвисает и не снимается ничем, даже сессия не убивается. Но не для этого запроса, на котором я экспериментировал.

> висеть marked она будет вечно
- ну не вечно. Обычно часа через 2 отваливается. А уж на следующий день ее по любому обычно уже нету.


Petr V. Abramov   (2008-03-17 13:39:00) [14]


> ANB   (17.03.08 12:54) [64]
.
> но запрос к ораклу НЕ СНИМАЕТСЯ ни одним из предложенных
> способов


там не асинхронка не доделана, а вообще прерывание выполнения запроса любым способом. Даже если снимать сессию через alter system kill session, часто можно получить 'session marked for kill' и висеть marked она будет вечно


ANB   (2008-03-17 13:37:00) [15]


> GO это не команда SQL, это команда "исполнителя скриптов"
> типа QA и его консольного аналога... она в скрипте не может
> не давать ошибки. что наводит на мысль, что чтото там у
> вас не так и с предыдущей ошибкой, может вся "аккуратность"
> DBLib просто в том, что написали вы с его использованием
> так, что ошибки попросту игнорирует? (там же надо весь механизм
> в том числе и с ошибками переписывать)

Аккуратность заключается в том, что работает со скриптом ОДИН к ОДНОМУ, как QA. А с АДО такого не получается.

Чесно говоря, лениво вытаскивать целый пример, тем более у вас с мс скл он, а у меня оракл. нельзя ли опубликовать только кусочек под кнопкой "отменить запрос" чтобы проверить саму методу ?


sniknik   (2008-03-17 13:25:00) [16]

> Кстати, и GO понимает без предварительной распилки скрипта.
GO это не команда SQL, это команда "исполнителя скриптов" типа QA и его консольного аналога... она в скрипте не может не давать ошибки. что наводит на мысль, что чтото там у вас не так и с предыдущей ошибкой, может вся "аккуратность" DBLib просто в том, что написали вы с его использованием так, что ошибки попросту игнорирует? (там же надо весь механизм в том числе и с ошибками переписывать)

> но запрос к ораклу НЕ СНИМАЕТСЯ ... но с ораклом асинхронка не доделана.
это можно поверить -> [61], нужно только желание... сделать строку коннекта и выполнить запрос в примере это 2 минуты. (имхо 98,8% за то что работает)


ANB   (2008-03-17 12:54:00) [17]


> если уж к ним сами спецы из мс приходили и сказали "работайте
> через DBLib!", ктоб смог отказаться?...

Основное приложение у них на АДО. Думаете, кому то сильно хотелось изучать DBLib, для написания утилит ?

Основная грабля АДО, как универсального средства - он плохо понимает уровень серьезности ошибки. Т.е. в хранимке произошла ошибка, ошибка кидается в лог, хранимка идет дальше. АДО же считает, что хранимка прервалась и выдает исключение. DBLib же работает аккуратно. Кстати, и GO понимает без предварительной распилки скрипта.


> как можно не сделать такой простой веши

Какой ? Я добился асинхронности, но запрос к ораклу НЕ СНИМАЕТСЯ ни одним из предложенных способов (Cancel, Close, Close коннекту, RollBack). Может, конечно, при работе с мс скл ситуация лучше, но с ораклом асинхронка не доделана.


sniknik   (2008-03-17 12:20:00) [18]

> 1. Думаю, не будете спорить, что работать с ораклом через АДО (при наличии нормальных библиотек) - извращение.
не работал с ораклом, сталкивался, но не работал, но если бы пришлось, первым бы, что попробовал было бы ADO.
а насчет "нормальных", кто сказал что они нормальные? не верю тем кто говорит что ADO "ненормально", это против моего опыта.

> Кстати, вместо того чтобы публиковать многокилобайтные исходники
я не даю/публикую исходников в ветках типа этой, в которой кроме трепа ничего не представлено. (причем инициатор трепа не я)

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

> Идея с переконнектом, имхо, ОЧЕНЬ плоха.
где переконнект? приведен и код и обьяснение, и тем не менее вы делаете вывод "со своей колокольни", неадекватный.
(как мне кажется аналогично и по всему остальному)

> ЗЫ. Я бы очень постеснялся наезжать на ребят из РНИВЦ.
а кто на них наезжает? читай тщательнее. если уж к ним сами спецы из мс приходили и сказали "работайте через DBLib!", ктоб смог отказаться?... вынуждены.
или там была ситуация типа описанной? начали с ADO не справились, перекинулись на DBLib... и начали долго долго писать свою обертку... (ну хоть какаято польза, поневоле спецом станешь)


ANB   (2008-03-17 11:50:00) [19]


> пока что, все "зубры" что мне встречались, те что "уходят"
> от ADO ищя "волшебных" возможностей в других технологиях,
>  все попросту "не разобрались с управлением".

1. Думаю, не будете спорить, что работать с ораклом через АДО (при наличии нормальных библиотек) - извращение.
2. Немного тяжелее с мс скл. Другой технологии, кроме АДО, мс и не предоставляет (DBLib - слишком низкоуровневая). Кстати, в АДО.НЕТ проблем НИКАКИХ не возникает. Он даже с ораклом работает более менее корректно. А вот нативный АДО вызывает проблемы. Мелкие, но противные.
Кстати, вместо того чтобы публиковать многокилобайтные исходники, может просто по русски написать, КАК прервать таки асинхронный запрос ?
Идея с переконнектом, имхо, ОЧЕНЬ плоха.
ЗЫ. Я бы очень постеснялся наезжать на ребят из РНИВЦ. Они ПЕРВЫМИ внедряли мс скл, причем под непосредственным руководством спецов из мс.
А уж сертификатов у них - все стены увешены.


sniknik   (2008-03-17 11:08:00) [20]

сорри, в прошлом примере глюк, не учел что прогресс в другом потоке, а я там "красоту навел" счетчик фетча обновляю и кнопки интерфейса дизейблю (т.е. фактически к VCL из потока пусть и неявного обращаюсь)... AV может быть.
замена
http://webfile.ru/1808019


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо