Конференция "Базы" » Отмена выполнения запроса
 
  • sniknik © (17.03.08 10:40) [60]
    > Тоже не ботает.
    > Cancel - игнорит
    если говоришь "не работает" приводи доказательства. у меня работает.

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

    > RollBackTrans - ругается, что транзакция не открыта
    ну так. если делаешь откат транзакции ее как минимум открыть надо... а вот как ты отреагируешь на совет уничтожить обьект(транзакцию) в дельфи? скажешь что ругается что обьект не существует?
    не понимаю правда как он этим хотел решить вопрос, и проверять неохота, но раз уж делать то правильно. не так ли?

    вообще это уже немного достает. вот пример (убрал лишнее и немного переделал и отмену и старт т.е. там теперь чуть больше кода чем приводил, но вы же и тот не осилили, куда вам дальше то. пишите свою, может разберетесь получше... )
    http://webfile.ru/1807960 (exe в rar архиве, 340кб)

    у меня естественно там свое, поменяйте строку коннекта и вносите свой запрос (не управляющую команду, а именно запрос), если ошибок нет должно выполнится.
    строка коннекта ставится по кнопке run так
     with ADOCon do
       if ConnectionString <> EdComText.Text then begin
         Close;
         ConnectionString:= EdComText.Text;
       end;

     
    т.е. если изменений в строке нет то остается старый коннект, есть то переконектится даже если там пробел незначащий добавили.
  • sniknik © (17.03.08 11:08) [61]
    сорри, в прошлом примере глюк, не учел что прогресс в другом потоке, а я там "красоту навел" счетчик фетча обновляю и кнопки интерфейса дизейблю (т.е. фактически к VCL из потока пусть и неявного обращаюсь)... AV может быть.
    замена
    http://webfile.ru/1808019
  • ANB (17.03.08 11:50) [62]

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

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

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

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

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

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

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

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

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


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

    Какой ? Я добился асинхронности, но запрос к ораклу НЕ СНИМАЕТСЯ ни одним из предложенных способов (Cancel, Close, Close коннекту, RollBack). Может, конечно, при работе с мс скл ситуация лучше, но с ораклом асинхронка не доделана.
  • sniknik © (17.03.08 13:25) [65]
    > Кстати, и GO понимает без предварительной распилки скрипта.
    GO это не команда SQL, это команда "исполнителя скриптов" типа QA и его консольного аналога... она в скрипте не может не давать ошибки. что наводит на мысль, что чтото там у вас не так и с предыдущей ошибкой, может вся "аккуратность" DBLib просто в том, что написали вы с его использованием так, что ошибки попросту игнорирует? (там же надо весь механизм в том числе и с ошибками переписывать)

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

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

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

    Чесно говоря, лениво вытаскивать целый пример, тем более у вас с мс скл он, а у меня оракл. нельзя ли опубликовать только кусочек под кнопкой "отменить запрос" чтобы проверить саму методу ?
  • Petr V. Abramov © (17.03.08 13:39) [67]

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


    там не асинхронка не доделана, а вообще прерывание выполнения запроса любым способом. Даже если снимать сессию через alter system kill session, часто можно получить 'session marked for kill' и висеть marked она будет вечно
  • ANB (17.03.08 14:07) [68]

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

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

    > висеть marked она будет вечно
    - ну не вечно. Обычно часа через 2 отваливается. А уж на следующий день ее по любому обычно уже нету.
  • Petr V. Abramov © (17.03.08 14:19) [69]

    > 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 (17.03.08 14:55) [70]

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

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


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

    Там - это в АДО ? Ни фига. Мой запрос отрабатывает 2 мин. В девелопере - снимается менее чем через секунду.
    Похоже, АДО не знает про OCIBreak() (да и откуда ? универсал же).
  • Petr V. Abramov © (17.03.08 15:04) [71]

    > ANB   (17.03.08 14:55) [70]


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

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

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

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

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

    У меня отчет уже третий час колбасит - не могу в делфу залезть.
  • ANB (17.03.08 17:50) [73]

    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 (17.03.08 17:56) [74]
    Во. Нашел. Cancel коннекту согласно доке должен помочь. Но не помогает.
  • Petr V. Abramov © (17.03.08 18:01) [75]

    > ANB   (17.03.08 17:56) [74]

    OCI-трассировщиком глянь, че он пытается делать
  • MsGuns © (17.03.08 21:02) [76]
    С ураклом не работал, но, думаю, что он тут не при чем - вся закавыка в неправильном (некорректном) использовании ADO.
    У меня с мсскл все весело снимается. Правда, это "весело" не распространяется на хранимки, в которых рекурсия - там надо трохе обождать, пока сервер "выйдет из транса" ;)

    Для того, чтобы это проверить, достаточно побаловаться с QA - там есть кнопка останова. Он же как-то это делает, а ? Или он не джетом пользуется ?
  • sniknik © (17.03.08 22:36) [77]
    > Правда, это "весело" не распространяется на хранимки, в которых рекурсия - там надо трохе обождать, пока сервер "выйдет из транса" ;)
    проверь в тесте [61], не должен ждать. ждешь ты, имхо, потому, что cancel "оберточный" используешь, а там вроде сделано с ожиданием ответа, специально, типа гарантировано. а QA бросает все на "произвол судьбы" не ожидая подтверждений.

    > Или он не джетом пользуется ?
    естественно не jet-ом, jet это access, а не mssql. но вообще чем бы он там не пользовался, все это можно повторить чисто на ADO (может им и пользуется, хотя он и ODBC*-шную dll подключает... может и его тоже, вперемешку). ну, более менее повторить, трудности наверняка будут, но пока я их не вижу (и они будут не там где могут подумать... а например в отсутствии грида для отображения, т.к. он явно работает с датасетами с серверным курсором, дельфишный такое отображать не может. и т.д. и т.п. неясно пока не столкнешся).
  • DmitriyG. © (18.03.08 00:16) [78]
    Сегодня поздно завтра проверю, отмену на большой базы для MSSQL
  • Anatoly Podgoretsky © (18.03.08 04:37) [79]

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

    Он пользуется ODBC
 
Конференция "Базы" » Отмена выполнения запроса
Есть новые Нет новых   [134432   +20][b:0][p:0.002]