Форум: "Базы";
Текущий архив: 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.048 c