Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-35553
SZap
2002-08-21 16:59
2002.09.12
кол-во записей в Query


4-35940
Dmk
2002-07-19 23:46
2002.09.12
Form.Visible


3-35575
AndbyOne
2002-08-22 10:19
2002.09.12
SQL запросик


6-35846
verman_sasa
2002-07-03 13:26
2002.09.12
Login в домен


1-35638
SomeQ
2002-09-01 10:08
2002.09.12
FindNext in RichEdit





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский