Форум: "Базы";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
ВнизПрерывание выполнения запроса Найти похожие ветки
← →
avr555 (2002-08-20 18:26) [0]У меня такя проблема:
Как можно прервать выполнение запроса?
Дело в том, что у меня в программе пользователь ручками пишет запрос а затем его выполняют. Но пользователь может ошибится и запрос будет выполнятся очень долго.
Первое что пришло в голову, это создать нить в котором этот запрос будет обрабатываться, но дальше идеи это не пошло.
Может кто сталкивался..
Заранее спасибо.
← →
TSV (2002-08-20 18:42) [1]Позволять юзерам писать запросы руцями - идеологически неправильно. Ошибки, неоптимизированность, безопасность и т.д.
Можно написать хранимые процедуры с параметрами...
← →
avr555 (2002-08-20 18:45) [2]Пишу я построитель запросов.
А построить могут все что угодно... :)
← →
Val (2002-08-20 18:52) [3]угу, нить и мочить.
← →
avr555 (2002-08-20 18:54) [4]А как мочить?
← →
Val (2002-08-20 18:58) [5]help: TThread|Methods
ведь даже примеры есть..
← →
avr555 (2002-08-20 19:10) [6]Если я правельно понял, то мне нужно воспользоваться методом Terminate.
Но в Хелпе написано, что этот метод не выполняет принудительную остановку нити, и что у меня в Execute должно самостоятельно проверяться свойство Terminated.
А у меня никакого цыкла нет.
← →
Val (2002-08-20 19:15) [7]..Unlike the Windows API TerminateThread, which forces the thread to terminate immediately,..
← →
avr555 (2002-08-20 19:19) [8]Я именно это и хотел сказать.
← →
avr555 (2002-08-20 19:23) [9]Я немного переформулирую вопрос:
Что и когда мне нужно сделать с TADOQuery, чтобы выполнение запроса прекратилось?
← →
Anatoly Podgoretsky (2002-08-20 19:30) [10]MSSQL позволяет ограничить выборку определенным количеством записей, очень полезная возможность для подобных случаев, ограничить первыми 100
← →
avr555 (2002-08-20 19:34) [11]По моему, такое же есть свойство есть и в TADOQuery.
Но, как мне кажется, можно написать запрос в котором и до выборки дело будет доходить очень долго.
← →
Val (2002-08-21 10:55) [12]>avr555 © (20.08.02 19:19)
ты не понял, я имел ввиду, что из текста видно, что можно использовать для непосредственного "убийства" нити :)
← →
Fiend (2002-08-21 11:04) [13]Это можно сделать через TADOCommand. Предварительно установите параметры у нее TAsyncExecute, это позволит запросу выполняться асинхронно, т.е. не тормозить ваш основной поток.
Когда нужно остановить выполнение запроса, выполните метод Cancel у этого компонента.
С наилучшими!
← →
Desdechado (2002-08-21 12:46) [14]убиваться будет соединение с клиентом, а на сервере остается запущенным длинный запрос. сервер его, конечно, прибьет, но не сразу (если выживет после запроса :)
← →
avr555 (2002-08-21 13:32) [15]Мне нужно посмотреть результат запроса.
У меня идет запрос на SELECT
← →
Fiend (2002-08-21 13:49) [16]То Desdechado
С чего это вы решили, что Cancel разорвёт соединение?
То avr555
Сделайте как я вам говорю, всё получится
← →
avr555 (2002-08-21 14:08) [17]
> Fiend © (21.08.02 13:49)
А как мне результат запроса посмотреть используя TADOComand?
← →
Fiend (2002-08-21 14:15) [18]То avr555
Уважаемый, напрягитесь и прочтите хотя бы мануал!
Вызов метода Execute, возвращает указатель на рекордсет, который возвращается запросом.
Если он nil, значит ничё не вернулось, если что то есть, то присвойте результат ADODataSet1.RecordSet
это написано в хэлпе
← →
avr555 (2002-08-21 16:27) [19]Спасибо, буду пробовать.
← →
avr555 (2002-08-21 16:41) [20]Что я делаю не правильно?
Код:
type
TMyThread = class (TThread)
private
AText:widestring;
protected
procedure Execute;override;
end;
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
Button2: TButton;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
ADOCommand1: TADOCommand;
ADODataSet1: TADODataSet;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
tmp : TMyThread;
procedure DoTerminate(Sender:TObject);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TMyThread }
procedure TMyThread.Execute;
var
i:integer;
s:widestring;
begin
if Form1.ADOCOmmand1.Execute <> nil then
begin
Form1.ADODataSet1.Recordset := Form1.ADOCommand1.Execute;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
tmp := TMyThread.Create(false);
tmp.Execute;
tmp.OnTerminate := DoTerminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.ADOCommand1.Cancel;
tmp.Terminate;
tmp.Free;
end;
procedure TForm1.DoTerminate(Sender: TObject);
begin
// Form1.ADOCommand1.Cancel;
end;
При выполнении Button1Click
Появляется сообщение "Не удается выполнить операцию во время асинхронного выполнения"
← →
Fiend (2002-08-21 16:49) [21]Ну во первых:
зачем вы сделали это в отдельном потоке.
Я ж вам русским языком сказал, Execute надо выполнять с параметром AsyncExecute. Тогда выполнение запроса само собой переносится в отдельный поток и ваш основной не останавливается в ожидании завершения метода Execute.
Во вторых:
какой умный человек вызывает метод Execute у потока?
Он сам запускается, без вас. К тому же вы поток создали уже работающий, а не спящий.
Еще раз говорю: читайте манулы!!!
← →
avr555 (2002-08-21 17:05) [22]Убрал свой поток.
У меня стояло в ExecuteOptions eoAsyncExecute - true
Все равно тоже сообщение
← →
Desdechado (2002-08-21 17:07) [23]2 Fiend © (21.08.02 13:49)
>С чего это вы решили, что Cancel разорвёт соединение?
я про Cancel ни буквы не написал. а пост был об убивании нити, в которой выполняется запрос
← →
avr555 (2002-08-22 15:44) [24]Может нужно как-то TADOCOmmand настроить
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c