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 сделать отмену выполнения запроса?
Вопрос мне кажется наболевший, но ответа нигде нет...


sniknik   (2008-03-17 10:40:00) [21]

> Тоже не ботает.
> 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;
 
т.е. если изменений в строке нет то остается старый коннект, есть то переконектится даже если там пробел незначащий добавили.


ANB   (2008-03-17 09:40:00) [22]


> и весь механизм работы с базами на функциях переписывать.
> ..

Зачем ? У меня есть библиотека компонентов для работы с мс скл, основанная на DBLib. Правда, кривоватая. Если сильно надо будет - починю и буду юзать. Или найду свежую прямую версию и куплю.
Если сильно сильно припрет - напишу свою. Не так уж и сложно.


ANB   (2008-03-17 09:36:00) [23]


> Есть.

Какая ?


> Для "снятия" используются в зависимости от контекста Cancel
> или RollBackTrans

Тоже не ботает.
Cancel - игнорит
RollBackTrans - ругается, что транзакция не открыта


> кстати, много кода с использованием DBLib написал?

Не. Не особо надо было - я практически с мс скл не работаю, для минимальных потребностей АДО хватало.
Нужно было как то написать надежный исполнитель скриптов - пришлось после кучи экспериментов с АДО использовать DBLib. Примеры работы содрал у ребят из Нижегородского РНИВЦ (вот там зубры так зубры в мс скл, респект им большой)


ANB   (2008-03-17 09:29:00) [24]


> И что же мешает выкинуть "гадость" и пользоваться "родными"
> компонентами ?

Я так и сделал.


MsGuns   (2008-03-15 20:45:00) [25]

>ANB   (14.03.08 13:54) [51]
>1. Спец.команды снятия запроса в АДО нету.

Есть.

>2. Close датасету - не помогает. Т.е. отрубается фактически тока фетч.

Close исп-ся для открытогодатасета, у нас же он еще как бы не открылся (запрос не выполнен)

>Запрос висит пока не выполнится, тока результата нету.

Уже писано было про синхрон/асинхрон - может стОит почитать хэлпы по ADO ?

>3. Пока запрос не выполнится, close коннекту делать низзя - ругается.

Разумеется. см. п.2 Close для коннекта аналогичен Close для запроса по смыслу. Для "снятия" используются в зависимости от контекста Cancel или RollBackTrans

>Вывод, не удививший меня : АДО - гадость, лучше пользоваться родными компонентами под используемую СУБД.

И что же мешает выкинуть "гадость" и пользоваться "родными" компонентами ?


DmitriyG.   (2008-03-15 17:05:00) [26]

Ну боюсь, то что приведено в [47] не будет работать для MSSQL сервера... В этом случае исходники не нужны....
Буду смотреть DBLib


sniknik   (2008-03-14 20:09:00) [27]

> можно посмотреть исходники для демо программы?
ты его уже видел в [47]... если выкинуть весь мусор от других тестов, то это все что есть, ну вернее закрытие, а открытие это Open и ShowModal после него, как уже говорил (прогресс бар и остальное что там было, это артефакты от других проб, и к обсуждаемому не относятся)
а вообще нет, нельзя. и не потому, что на работе остался... даже в понедельник не дам, из принципа. ты вот не привел ни единой строчки своего кода, не проверил ни одного моего утверждения, не сказал ничего конкретного и т.д. поэтому для меня ветка из разряда "потрепательских" - т.е. треплемся, развлекаемся и никакого кода... (а то все веселье кончится)
сделай чтонибудь сам. докажи. тогда возможно и помогу.

> Зато все работает асинхронно, срубается, ошибки ловятся ВСЕ и прочие полезности.
т.е. ничего нового? и стоит парится и весь механизм работы с базами на функциях переписывать...
кстати, много кода с использованием DBLib написал?


ANB   (2008-03-14 18:17:00) [28]


> ЗЫ А есть ли специальные компоненты для доступа к MSSQL?

Я видел, но они кривоватые. Самое гибкое - через DBLib ломится. Но там библиотека, никаких компонентов. Короче, сильно непросто. Зато все работает асинхронно, срубается, ошибки ловятся ВСЕ и прочие полезности. Короче, один одному как QA пашет.

> (как у ANB не получается пока для Oracle).
а мне и не надо - я одаком и доа пользуюсь. там все и так получается без лишних проблем.


DmitriyG.   (2008-03-14 17:15:00) [29]

To sniknik: можно посмотреть исходники для демо программы? У меня пока складывается тоже впечатление, что сделать отмену для MSSQL сервера не получится через ADO... (как у ANB не получается пока для Oracle).

ЗЫ А есть ли специальные компоненты для доступа к MSSQL?


ANB   (2008-03-14 13:54:00) [30]

Короче, провел эксперимент.
Условия :
коннечусь через АДО к ораклу (МС СКЛ нету, да и может и правда, не поддерживает он отмену запроса).
Запускаю асинхронно длительный запрос, возвращающий одну строку (коунт по большой таблице).
Делаю тоже самое в девелопере.
Запросу дал доработать и снимал его.
Результат :
1. Спец.команды снятия запроса в АДО нету.
2. Close датасету - не помогает. Т.е. отрубается фактически тока фетч. Запрос висит пока не выполнится, тока результата нету.
3. Пока запрос не выполнится, close коннекту делать низзя - ругается.
4. Девелопер снимает запрос практически мгновенно. Аналогично ведут себя ОДАК и ДОА. Генерится ошибка ОРА-01013.
Вывод, не удививший меня : АДО - гадость, лучше пользоваться родными компонентами под используемую СУБД.


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


> (хотя... сколько раз "рубил" для статистики? сотню, две,
>  ...?

Сотен пять точно. Не для статистики - отлаживались. Иногда кнопку жмешь, а QA не сразу запрос рубит. Самая беда - выполнение сложной хранимки.
Впрочем, это года 2 назад было. Статистику точную - на каких именно операциях подвисает, не собирали. Возможно, сервер что то подчищал.


sniknik   (2008-03-13 18:04:00) [32]

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

> Жмешь кнопку и запрос снимается.
аналогично. см. тест выше.

> Правда, не всегда.
всегда. (хотя... сколько раз "рубил" для статистики? сотню, две, ...? а я до пары десятков не дотянул... может все еще впереди)


ANB   (2008-03-13 17:49:00) [33]


> а именно сессия/процес/поток

да не срубается сессия ! посылается спец. команда "юзер запросил отмену текущей операции". Большей частью, если не сильно задумался, оракл на нее реагирует и генерит исключение (оно потом приезжает обратно на клиента).

>  Close всему коннекту...

1. Скорее всего, пока коннект не закончит работу (выполнение запроса), коннект не будет выполнять эту команду
2. Это извращение - отконнекчиваться, теряя текущий контекст, для срубания запроса.
В QA все нормально и так работает. Жмешь кнопку и запрос снимается. Правда, не всегда.


sniknik   (2008-03-13 17:36:00) [34]

> ADODataSet1.Close не закрывает асинхронным запрос
наверное у тебя ошибка в программе...

у меня вот все работает замечательно, хоть и на скорую руку (см. видео, в архиве rar - 36 кб. exe с базой посылать рука не подымается. за код стыдно (помойка от разных тестов))
http://webfile.ru/1801097
"твой" код из кнопки
procedure TForm2.Button1Click(Sender: TObject);
begin
 with Form1 do begin
   ADODataSet1.Close;
   Label1.Caption:= '0';
   ProgressBar1.Position:= 0;
 end;
 Close;
end;


> равно как и Cancel  не помогает :-(
сделай более глобально, Close всему коннекту...


DmitriyG.   (2008-03-13 16:44:00) [35]

В том то и дело что
ADODataSet1.Close не закрывает асинхронным запрос, равно как и Cancel  не помогает :-(


sniknik   (2008-03-13 13:55:00) [36]

вот, даже залез в хелп...
"убийство" потока ->
KILL SPID
если найдешь SPID запроса, то снимешь...


sniknik   (2008-03-13 13:45:00) [37]

sniknik ©   (13.03.08 13:43) [43]
> извне "убить"
... извне "убить" можно, ...


sniknik   (2008-03-13 13:43:00) [38]

> Тогда почему кнопочка убийства запроса доступна только при многосессионной настройке?
да, имхо, потому что там тоже самое что у mssql, просто процессы названы сессиями. разницы то. и "срубается" не запрос, а именно сессия/процес/поток (если "аналогиловать" с программой, поток извне "убить", процедуру/функцию в нем выполняющуюся отдельно нет (а вот по проверке внутри ее легко можно выйти).).


sniknik   (2008-03-13 13:38:00) [39]

> Кстати, в мс скл, если лезть через DBLib, тоже аккуратно все срубается.
у меня почемуто чувство, что ты опять о чемто не о том...

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

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


ANB   (2008-03-13 13:35:00) [40]


> Sergey13 ©   (13.03.08 13:29) [39]

Не наю. Но посмотри список сессий для девелопера. Видно, что на кажное окно - одна сессия. И при выполнении запросов тока статус меняется.
Впрочем, мона сделать и несколько сессий, если врубить распараллеливание, но это уже оракл сам делает, девелопер ни при чем.
Самое простое - посмотреть ОДАК. При наличии одной сессии, можно без проблем асинхронно выполнять запрос/блок (ожидая в цикле или модальной формой), и, если не подвесил интерфейс, без проблем срубить выполнение.
Правда, иногда бывают проблемы, т.е. не все запросы/блоки срубаются.


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

Наверх

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