Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.25;
Скачать: CL | DM;

Вниз

Прерывание выполнения запроса   Найти похожие ветки 

 
NAlexey ©   (2004-07-02 09:03) [0]

Хотелось бы реализовать нечто подобное как в Query Analyzer, где возможно прервать запрос во время его выполнения. Для этого запускаю запрос в отдельном потоке. Но вот прервать как раз его не получается. Terminate := True; не помогает. Ну это и понятно, решал ли кто такую задачу? Если да, то какой подход необходимо использовать?


 
Курдль ©   (2004-07-02 10:06) [1]


> решал ли кто такую задачу?

А зачем, позвольте спросить, создавать такой запрос, чтобы потом же его и прерывать???


 
NAlexey ©   (2004-07-02 10:12) [2]

>Курдль ©   (02.07.04 10:06) [1]
А что, ты считашь что это абсурдная задача?


 
Курдль ©   (2004-07-02 10:18) [3]


> NAlexey ©   (02.07.04 10:12) [2]
> А что, ты считашь что это абсурдная задача?

Пытаюсь понять непонятное. За всю мою "практику" ни разу не возникало необходимости прервать запрос.


 
Соловьев ©   (2004-07-02 10:21) [4]


> [3] Курдль ©   (02.07.04 10:18)

значит Вы или гений, или запросы у Вас типа селект из одной таблицы. Всякое бывает когда идет разработка. Нормальная проблема.
В ФБ можно снять запрос с помощью генератора и если этот запрос запускается в виде ХП. Может можно такое сделать и в MS SQL, а может там для этотго конечно есть средства.


 
Курдль ©   (2004-07-02 10:26) [5]

Я, конечно, не гений - только учусь... Прошелся по базарчику - спросил еще пятерых разработчиков БД-ориентированных проектов.
Никто не сознался, что была нужда отменить запрос.
Видимо такие проблемы возникают у тех, кто злоупотребляет серверной логикой...


 
so_well   (2004-07-02 10:32) [6]

ну если запрос выполняется секунд 30, то, наверное, логично дать возможность юзверю прервать его если он передумал его запускать


 
dimm22   (2004-07-02 10:34) [7]

Чё то несовсем понял, где должен прерываться запрос. Уже в готовом приложении или при разработке приложения, в том же IbExpert"e например?


> Для этого запускаю запрос в отдельном потоке. Но вот прервать
> как раз его не получается. Terminate := True;


Насчёт прерывания исполнения потока, то тут нужен Suspend.


 
Курдль ©   (2004-07-02 10:34) [8]


> so_well   (02.07.04 10:32) [6]
> ну если запрос выполняется секунд 30, то, наверное, логично
> дать возможность юзверю прервать его если он передумал его
> запускать

А где Вы видели запрос, который выполняется 30 секунд?
(Я мож чего-то не догоняю... Извините, я никогда не работал с MS SQL).


 
NAlexey ©   (2004-07-02 10:35) [9]

>Курдль ©   (02.07.04 10:26) [5]
Хм... Предположим я в программу вставляю билдер запросов, хочу сделать механизм применяющийся в Query Analyzer. Я злоупотребляю серверной логикой? По моему озвучил это в самом вопросе.
Конечно это все хорошо, а по существу?


 
Sandman25 ©   (2004-07-02 10:37) [10]

>А где Вы видели запрос, который выполняется 30 секунд?

Счастливый человек. Мне приходилось заниматься оптимизацией ХП из 1000+ строк, чтобы она работала 5 минут вместо 15...


 
Соловьев ©   (2004-07-02 10:38) [11]


> [8] Курдль ©   (02.07.04 10:34)

такое ощущение что Вы пишете программы без ошибок, причем сразу с ТЗ :)
Бывает и дольше. Какой-нибудь отчет или поиск может и дольше выполнятся чем 30 сек.


 
dimm22   (2004-07-02 10:42) [12]


> Конечно это все хорошо, а по существу?

Если хочешь прервать выполнение потока, то Suspend делай ему, негодяю :-)


> >А где Вы видели запрос, который выполняется 30 секунд?


Ну у меня есть несколько. И что?


 
Курдль ©   (2004-07-02 10:49) [13]


> Соловьев ©   (02.07.04 10:38) [11]
> такое ощущение что Вы пишете программы без ошибок, причем
> сразу с ТЗ :)

Дык я пишу программы на практически чистой базе. Это потом она наполняется и тестируется.
А запросы обкатываю средствами СУБД, прежде чем пихать в прогу.
Слабые места БД определяются еще на этапе ТЗ, когда заказчик заявляет, типа: "У нас будет 1000 операций в день". Тогда становится ясно, что НД придется ограничивать по каким-то критериям, прежде, чем передавать на клиента.

NAlexey ©   (02.07.04 10:35) [9]
>Хм... Предположим я в программу вставляю билдер запросов, хочу сделать механизм применяющийся в Query Analyzer.


Это для "программируемых отчетов", или чего-то типа того?


 
Sandman25 ©   (2004-07-02 10:57) [14]

[13] Курдль ©   (02.07.04 10:49)

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


 
NAlexey ©   (2004-07-02 11:01) [15]

>dimm22   (02.07.04 10:42) [12]
Suspend приостанавливает выполнение потока. Т.е если я ничего не упустил, мне не удастся сделать ему Terminate до тех пор пока я не сделаю ему Resume? Одним словом выполнение запроса придется завершить по любому?

>Курдль ©   (02.07.04 10:49) [13]
В системе есть тип данных "запрос". Пользователь может создавать и запускать запросы. Я пишу редактор запросов, отладчик так сказать, с проверкой синтаксиса и проч.


 
Курдль ©   (2004-07-02 11:06) [16]


> >Курдль ©   (02.07.04 10:49) [13]
> В системе есть тип данных "запрос". Пользователь может создавать
> и запускать запросы. Я пишу редактор запросов, отладчик
> так сказать, с проверкой синтаксиса и проч.

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


 
NAlexey ©   (2004-07-02 11:10) [17]

>А не слишком жирно для юзеров?
Юзер юзеру рознь.


 
Курдль ©   (2004-07-02 11:25) [18]

Разве для юзеров, умеющих писать запросы не все еще написано?
DB Artisan, PLSQL Developer, Oracle Discoverer, Interactive SQL, IBExplorer и т.п.


 
NAlexey ©   (2004-07-02 11:34) [19]

>Курдль ©   (02.07.04 11:25) [18]
А ты что, поставляешь все эти программы со своей?


 
Курдль ©   (2004-07-02 11:39) [20]


> >Курдль ©   (02.07.04 11:25) [18]
> А ты что, поставляешь все эти программы со своей?

"Юзеры, которые умеют писать запросы" не покупают у меня программные продукты, а продают свои :(


 
NAlexey ©   (2004-07-02 11:45) [21]

>Курдль ©   (02.07.04 11:39) [20]
значит ли это что каждый кто написал:
select * from table1 where imya like "%Вася%"
бежит на рынок с релизом?


 
sniknik ©   (2004-07-02 11:47) [22]

если нужно подобие Query Analyzer то и методы работы должны его быть, это значит ADO и асинхронное выполнение запроса, в этом случае он легко "снимается". (легкое подозрение есть что сервер его иногда всетаки до конца выполняет в некоторых случаях, но и в QA аналогично)

если интересует, есть у меня гдето пример давно писал, если найду могу выслать. (обьяснять дольше, хотя там и элементарно все)


 
inic ©   (2004-07-02 11:47) [23]

Из всех известных мне СУБД, документированная (и то хреново) функция по прерыванию запроса имеется только в >= IB6.5.
Есть слух, что то же появится в FB2.
К сожалению, я также пытался придумать способ для MSSQL Server, даже пытался использовать Defaults также как юзают генераторы в FB, но изменение Defaults для уже начавшегося запроса "незаметно". Но может быть тот, кто ВСЕ знает и скажет нам истину :)))


 
Курдль ©   (2004-07-02 11:49) [24]


> NAlexey ©   (02.07.04 11:45) [21]
> значит ли это что каждый кто написал:
> select * from table1 where imya like "%Вася%"
> бежит на рынок с релизом?

Пожалуй, нет. Но, "от противного": те, кто не бежит на рынок с релизом, обычно посылают ... разработчиков, которые предлагают им писать select * from table1 where imya like "%Вася%", вместо того, чтобы применить фильтр или написать выражение типа Ёкселя.


 
Anatoly Podgoretsky ©   (2004-07-02 11:50) [25]

so_well   (02.07.04 10:32) [6]
Нельзя прервать, то что не запущено


 
NAlexey ©   (2004-07-02 11:56) [26]

>sniknik ©   (02.07.04 11:47) [22]
Запускаю ADOCommand, ExecuteOption := eoAsyncExecute; Делаю ADoCommand.Cancel; Ноль эффекта, продолжает выполнятся, и набор записей возвращает:

procedure TForm1.Button1Click(Sender: TObject);
begin
 if ADODataSet.Recordset <> nil then
   ADODataSet.Close;
 Caption := "";
 ADOCommand.CommandText := Memo1.Text;
 ADOCommand.Execute;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 ADOCommand.Cancel;
end;

procedure TForm1.ADOConnection1ExecuteComplete(Connection: TADOConnection;
 RecordsAffected: Integer; const Error: Error;
 var EventStatus: TEventStatus; const Command: _Command;
 const Recordset: _Recordset);
begin
 if Recordset <> nil then
 begin
   ADODataSet.Recordset := Recordset;
   Caption := IntToStr(ADODataSet.Recordset.RecordCount)
 end;
end;


 
sniknik ©   (2004-07-02 12:10) [27]

делай клозе, и не только датасету но и конекту иначе с этим датасетом работать будет нельзя пока запрос не "довыполнится"


 
NAlexey ©   (2004-07-02 12:13) [28]

>sniknik ©   (02.07.04 12:10) [27]
Хм... А где же тогда уверенность что сделай я какой нибудь Update а потом отменив в середине у меня произойдет откат?


 
Курдль ©   (2004-07-02 12:15) [29]

Откат инициируется автоматически сервером при разрыве соединения.


 
NAlexey ©   (2004-07-02 12:19) [30]

>Курдль ©   (02.07.04 12:15) [29]
Т.е получается что
 AdoConnection.Connected := False;
 AdoConnection.Connected := True;
?
>sniknik ©   (02.07.04 12:10) [27]
Пришли пожалуйста на alexey@byte-et.ru пример если не трудно, ознакомлюсь.


 
sniknik ©   (2004-07-02 12:20) [31]

пример выслал, а то мы тут долго переписыватся будем ;о).

там под access правда, но ничего разберешся. подставь туда "серьезную" табличку (у меня 170тыс, более менее видно, меньшие "пролетают" трудно заметить)
да это вообщето не прерывание запроса а прерывание получения данных, сервер (как и подозревал ;) запрос выполняет. но обычно это и нужно, хотя в MSSQL есть возможность и выполнение самого запроса прервать, но я этого не делал только хелп читал. могу поискать... но ломает. ;о)


 
Курдль ©   (2004-07-02 12:21) [32]


> NAlexey ©   (02.07.04 12:19) [30]
> Т.е получается что
>  AdoConnection.Connected := False;
>  AdoConnection.Connected := True;

Попробуй. Я с ADO не работал и не знаю, даст ли оно закрыть соединение до отработки всех запросов.


 
NAlexey ©   (2004-07-02 12:22) [33]

>MSSQL есть возможность и выполнение самого запроса прервать
Есть... Kill и все тут.


 
inic ©   (2004-07-02 12:29) [34]


> >MSSQL есть возможность и выполнение самого запроса прервать
> Есть... Kill и все тут.


Если работать напрямую (через API) то вроде SQLCancel
(SQL Books Online)



Страницы: 1 вся ветка

Текущий архив: 2004.07.25;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.036 c
8-1084255400
Akron
2004-05-11 10:03
2004.07.25
Добавление ani курсора в RC и использование его в EXE


3-1088606707
@Lex
2004-06-30 18:45
2004.07.25
Запрос


9-1081369937
GigoVich
2004-04-08 00:32
2004.07.25
Обмен опытом, но не делать сразу игру!


6-1085612967
Viner
2004-05-27 03:09
2004.07.25
Проверка почты


4-1087278653
Tolea
2004-06-15 09:50
2004.07.25
Перенаправить стандартны ввод с клавиатуры