![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отмена выполнения запроса
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]
Не наю. Но посмотри список сессий для девелопера. Видно, что на кажное окно - одна сессия. И при выполнении запросов тока статус меняется.
Впрочем, мона сделать и несколько сессий, если врубить распараллеливание, но это уже оракл сам делает, девелопер ни при чем.
Самое простое - посмотреть ОДАК. При наличии одной сессии, можно без проблем асинхронно выполнять запрос/блок (ожидая в цикле или модальной формой), и, если не подвесил интерфейс, без проблем срубить выполнение.
Правда, иногда бывают проблемы, т.е. не все запросы/блоки срубаются.