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

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

Прервать выполнение запроса [D5, MSSQL]


Страницы:   1 2

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]

Прервать выполняющийся запрос внешним воздействием не удастся...


Страницы:   1 2

Наверх

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