Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.049 c
1-1089546125
Optimizator
2004-07-11 15:42
2004.07.25
Компонент label


1-1089367993
Alek
2004-07-09 14:13
2004.07.25
мемо как в аське!


3-1088502504
Akella
2004-06-29 13:48
2004.07.25
Перемещение по записям DBGrid


8-1078469704
AlexTregubov
2004-03-05 09:55
2004.07.25
Интерполяция изображения


9-1080408372
AbLaZe
2004-03-27 20:26
2004.07.25
Прорисовка карты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский