Як зупинити виконання запиту в ado

Як зупинити виконання запиту в ADO

Чи можна зупинити виконання запиту запущеного через ADO?
Query Analyzer якось же це робить.

виконання запиту не зупиняється, зупиняється отримання даних (легко якщо використовувати асинхронне виконання, просто Клозе заріс роби)
а перервати можна тільки процес (KILL) якщо узнаеш його номер у запиту. теж без проблем (напевно. не пробував за непотрібністю)

тобто можна зробити так: в окремому тред запустити асинхронний Open, а в основному потоці зробити Close? Або робити TerminateThread?

Не плутайте, асинхронний це не в окремому (твоєму) потоці, а з налаштуванням ADO на асинхронність (воно саме створить потік), над твоїм зовнішній об'єкт (ADO) ніякої влади не має.

Я завжди вважав що Cancel - є відміна змін поточної записи. Delphi Help: Cancels modifications to the active record if those changes are not yet posted.

При спробі закрити датасета (Close) видається помилка: не вдається виконати операцію під час асинхронного виконання.
(Ставлю eoAsyncExecute, eoAsyncFetch, eoAsyncFetchNonBlocking в true).

Щоб зрозуміліше було: мені потрібно показувати дані з Детайля-датасета а при переміщенні по майстру, але Детайля відкривається довго (секунди 3), тому якщо користувач перейшов на інший рядок потрібно щоб відкриття Детайля припинилося і почалося для поточного запису.

> Ставлю eoAsyncExecute, eoAsyncFetch, eoAsyncFetchNonBlocking в true
спробуй якесь одне.

не знаю що і сказати; о), у мене працює.
хоча було і таке, пояснював, порівнювали настройки, а після висилав тест (простенька в одну дію програма, на отримання рекордсета в асинхронному режимі).
тест працював, хоча говоит саме ті ж параметри до цього виставляли.
може счас з цього почати? вислати приклад?
правда він під access (думаю не проблема створити базу і таблицю з 171тис (багато в загальному) записів)

> # XA0; Щоб зрозуміліше було: мені потрібно показувати дані з Детайля-датасета а при переміщенні по майстру, але Детайля відкривається довго (секунди
> 3), тому якщо користувач перейшов на інший рядок потрібно щоб відкриття Детайля припинилося і почалося для поточного запису.
просто серверний курсор не влаштує? буде відкривати тільки те що в гід влазить.

> Може счас з цього почати? вислати приклад?
Якщо можна [email protected]
Заздалегідь дякую, не перший раз отримую від вас хороші поради :)

> Просто серверний курсор не влаштує? буде відкривати тільки те
> Що в гід влазить.
У мене Детайля формується через ХП.

послав. там в принципі запутатся не можна (3 кнопки всього), до використання 2. коннект раджу спочатку не перебудовувати краще базу з таблицею потрібної підсунь (ім'я як там, + бажано багато записів і поле автоінкремент призначений ключем (межет бути важливо, в моїх таблицях є) ).
а як убедішся що працює, роби що хочеш.

Сенкс, отримав. Працює.
Працює бо йде прямий селект на таблицю і ADO запускає одельная потік на отримання (Fetch) вже готових даних. Тобто можна перервати процес отримання результатів запиту, якщо вони занадто великі.
А у мене ж результат запиту формується ХП-ой і мабуть АДО чекає поки вона виконається.

Я ж кажу що у адошного "Рекордсета" є метод Cancel:
ADOConnection.DataSets [0] .Recordset.Cancel;
MSDN:

Cancel Method
Cancels execution of a pending, asynchronous method call.

Syntax
object.Cancel
Remarks
Use the Cancel method to terminate execution of an asynchronous method call (that is, a method invoked with the adAsyncConnect, adAsyncExecute, or adAsyncFetch option).

Так, я був не правий. Подивився на метод Cancel у TADODataSet, він
його успадковує від TDataSet, тобто робить скасування змін.
А ось наприклад у TADOCommand Cancel успадковується від Recordset "a :)

Спасибі, тепер зрозуміло куди копати.

Схожі статті