Форум: "Базы";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
ВнизКак прервать асинхронное выпосление запроса, который возвращает д Найти похожие ветки
← →
Bless © (2004-03-29 16:35) [0]Речь об АДО-компонентах.
Как прервать асинхронное выпосление запроса, который возвращает данные
и каким компонентом лучше воспользаваться?
У ADODataSet нет Cancel-а.
У ADOCommand есть Cancel, но как потом работать с возвращенным набором
данных, если у него нет свойства Recordset?
← →
sniknik © (2004-03-29 16:42) [1]> Как прервать асинхронное выпосление запроса, который возвращает данные
не получится, на сервере он все одно завершится, можно прервать получение данных. просто close.
> У ADOCommand есть Cancel, но как потом работать с возвращенным набором
> данных, если у него нет свойства Recordset?
ADODataSet.RecordSet:= ADOCommand.Execute;
но это тоже самое.
← →
Bless © (2004-03-29 17:17) [2]sniknik[1]>
>ADODataSet.RecordSet:= ADOCommand.Execute;
>но это тоже самое.
Не совсем. Например, надо сделать крупную выборку с возможностью прервать ее. Как это сделать?
cmd.ExecuteOptions:=cmd.ExecuteOptions+[eoAsyncFetch];
Если сделать сразу вслед за этим
ds.dataset:=cmd.Execute, то в ds будет не весь результат, а только то, что успело выбраться к моменту выполнения команды. Или нет?
← →
sniknik © (2004-03-29 17:31) [3]а тебе нужен весь, сразу?
тогда немного не так, делаеш в одном датасете (чтобы свой поток не делать с ожиданием) с параметром eoAsyncFetch Open, а в его ADODataSet1.onFetchComplete делаеш ADODataSet2.Clone(DataSet); ко всем контролам привязывай естественно второй.
или даже лутше
делаеш запрос в ADOCommand с опцией eoAsyncExecute а в ADOConnection1.onExecuteComplete - ADODataSet2.Recordset:= Recordset;
к контролам естественно его(2) привязывай. еще естественно проверяй Command.State вдруг не завершился и Command.CommandText вдруг не тот. ;о)
← →
Bless © (2004-03-29 18:10) [4]sniknik[3]> Спасибо. Попробую.
← →
Bless © (2004-03-30 09:43) [5]sniknik © (29.03.04 16:42) [1]>
>можно прервать получение данных. просто close.
Тут еще один вопрос возник:
Сделал простое приложение.
1 adodataset с ExecuteOptions=eoAsyncExecute
и выборкой из большой таблицы.
Так вот, если закрыть приложение до того, как закончилась выборка,
то выскакивает ошибка
Project Project1.exe raised exception class
EOleException with message
"Operation cannot be performed while executing asynchronously".
Process stopped. Use Step or Run to continue.
Причем, adodataset.close при закрытии формы ничего не меняет.
И если пошагово прогнать, видно, что
команда adodataset.close срабатывает нормально а ошибка выскакивает
непонятно где (на последнем "end." в project1).
Кто знает причину?
Эта ошибка не выскакивает, если вместо eoAsyncExecute стоит eoAsyncFetch.
← →
Bless © (2004-03-30 09:57) [6]Из интереса поменял adodataset na adocommand
с тем же запросом
select * from pozib (в pozib - 300 000+ записей)
а в OnClose формы вместо adodataset.close - adocommand.cancel.
В результате, после alt+f4 на adocommand.cancel все застряло
секунд на 30 - время, достаточное для завершения выборки.
Как сие пояснить?
← →
sniknik © (2004-03-30 12:03) [7]> Эта ошибка не выскакивает, если вместо eoAsyncExecute стоит eoAsyncFetch.
говорил же асинхронное получение данных и выполнение, есть разница, прервать можно получение, выполнение это привилегия сервера.
(насколько понимаю)
> Как сие пояснить?
ты полностью зависиш от того как там метод написан в com обьекте (влезть в него нет возможности), и если ему проще завершить выборку чем терминировать, то так тому и быть. ;)
← →
Bless © (2004-03-30 14:39) [8]:)
Ладно, да будет так.
Спасибо.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.036 c