![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прервать выполнение запроса [D5, MSSQL]
MakNik © (2004-07-21 09:53:00)Есть некий запрос, который выполняется достаточно долго (порядка 10 мин.)... Подскажите, плз., как после команды ADOQuery.Active:=true; ... дать возможность пользователю корректно отказаться от завершения выполнения запроса?
Johnmen (2004-07-21 14:54:00) [21]>Fiend © (21.07.04 14:43) [16]
>ну конечно, уверен. Я смотрел в current activity.
Благодарю.
Что значит "смотрел в current activity" и что там видно ?
Fiend (2004-07-21 14:43:00) [22]То Johnmen © (21.07.04 13:30) [15]
ну конечно, уверен. Я смотрел в current activity.
Подобные вещи я еще сквозь БДЕ проджелывал, но там технология немного сложнее :)
Архитектура ЬС СКЛ сервера изначально была таковой, еще когда МС его совместно с Сибэйзом разрабатывал. И Сибэйз тоже унаследовал это полезное временами свойство.
А вот в документации на ИБ написано, что фундамент они заложили для остановки запросов, но не реализовали. Могу строки из мануала в ПДФ найти, если интересно.
Johnmen (2004-07-21 13:30:00) [23]>Fiend © (21.07.04 13:15) [13]
Т.е. ты уверен, что именно сервер бросил выполнять запрос ?
>Fiend © (21.07.04 13:19) [14]
>Если сам сервер в состоянии его прервать,
Вот в этом и сомнения.
Fiend (2004-07-21 13:19:00) [24]То Ega23 © (21.07.04 11:21) [10]
Если сам сервер в состоянии его прервать, то и тебе это удастся
Fiend (2004-07-21 13:15:00) [25]То bushmen © (21.07.04 11:25) [11]
цитирую себя же:
> При этом надо не забыть поставить в свойствах ADOCommand
> асинхронное выполнение запроса.
Johnmen © (21.07.04 11:16) [8]
было установлено опытным путём.
метод описан с хелпе на АДОКомманд
Анонимщик (2004-07-21 11:55:00) [26]Не знаю как в MSSQL, в Interbase есть такая же проблема. Решается, например, убиванием транзакции. На сервере запрос выполнение не прекратит. Можно попытаться использовать генератор, а в запросе - проверку генератора на какое-то значение. Если нужно снять запрос, значение генератора меняешь, и из запроса вываливаешься по невыполнению условия. Минус - генераторов на всех не напасешься. А вообще-то такие запросы очень часто (не буду утверждать, что всегда) долго выполняются из-за неправильного составления, ну, забыл связать таблицы, вот и результат - простое умножение таблиц.
Можешь привести текст запроса?
bushmen (2004-07-21 11:25:00) [27]> А у этого класса в свою очередь есть метод Cancel который и
> позволит остановить выполнение запроса.
Интересно, а как ты собираешься вызывать этот метод во время выполнения процедуры?
Ega23 (2004-07-21 11:21:00) [28]вот пример:
if exists (select * from sysobjects where id = object_id(N'[S_MyProc]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [S_MyProc]
GO
CREATE PROCEDURE S_MyProc
As
While 0=0
begin
Select into #xxx * from Table1
Drop tble #xxx
end
GO
И на клиенте, соответственно:
Exec S_MyProc.
Убьётся ли такой запрос?
Ega23 (2004-07-21 11:17:00) [29]Надо будет попробовать поэксперементировать...
Johnmen (2004-07-21 11:16:00) [30]>Fiend © (21.07.04 11:15) [7]
>канечна убивается
Можно ткнуть в источник ?
Fiend (2004-07-21 11:15:00) [31]То Ega23 © (21.07.04 11:04) [6]
а как же иначе?
канечна убивается
Ega23 (2004-07-21 11:04:00) [32]Fiend © (21.07.04 10:51) [5]
Убивается ли при этом выполнение запроса непосредственно на сервере?
Fiend (2004-07-21 10:51:00) [33]он конечно не должен, но принципиально можно.
Для этого нужно использовать TADOCommand. Запрос ессесно выполнять через него. А у этого класса в свою очередь есть метод Cancel который и позволит остановить выполнение запроса. При этом надо не забыть поставить в свойствах ADOCommand асинхронное выполнение запроса.
Ega23 (2004-07-21 10:37:00) [34]... а как это сделать из приложения?
Повторяю: Это НЕШТАТНАЯ ситуация, пользователь не должен такие вещи делать.
MakNik (2004-07-21 10:30:00) [35]
> Ega23 ©
... а как это сделать из приложения?
Ega23 (2004-07-21 09:57:00) [36]Enterprise Manager -> Management -> Current activity -> Process Info -> Найти свой процесс и убить его.
Только это не корректное завершение, это не штатная ситуация.
Johnmen (2004-07-21 09:54:00) [37]Прервать выполняющийся запрос внешним воздействием не удастся...