powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Прервать выполнение запроса
22 сообщений из 22, страница 1 из 1
Прервать выполнение запроса
    #37749798
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем есть ADO Recordset возможно ли отменить его открытие
когда уже вызван метод Open не дожидаясь когда рекордсет откроется???
В принципе догадаюсь, что решение связанно с многопоточностью,
запускать выполнение запроса в отдельный поток, а затем при необходимости убивать его
Но тогда у меня возникает другой вопрос, как организовывается многопоточность?
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37749816
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе поможет асинхронное выполнение запроса. У Open есть соответствующий параметр.
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37749825
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
ок спс
сейчас посмотрю
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37749874
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Так нашел параметр – adAsyncExecute (он?)
State – помогает узнать, отработан ли запрос
Ну а как прервать выполнение запроса или он в любом случаи отработает до конца, но потихому типо незаметно?
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37749886
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Cancel
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37749894
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А Семен Семенович спасибо!

Shocker.Pro огромное спасибо!
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37751100
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TpaBkaНу а как прервать выполнение запроса или он в любом случаи отработает до конца, но потихому типо незаметно?Это зависит от сервера и интерфейсного драйвера.
Не все сервера умеют прерывать выполнение запроса в принципе.
Если сервер имеет команду "отменить запрос" она не всегда является реальной отменой. Я встречал сервера которым проще закончить обработку запроса и просто забыть результат чем отменять обработку запроса на середине.
Кроме собственно серверных вариаций свои пять копеек может вносить интерфейсный драйвер. Там вообще может быть что угодно, от полного игнорирования команды на отмену, до физического обрыва соединения с сервером и создания нового коннекта.
В общем, универсального ответа на вопрос "как делается отмена запроса" просто не существует. Надо смотреть на сервер и драйвера (версию драйверов!).
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37751225
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, я тоже сталкивался. Скажем так. Можно отправить .Cancel в рекордсет и забыть о нем, а для открытия следующего рекордсета не использовать эту переменную, а инициализировать другую. Тогда рекордсет, даже если он не отменится, будет в фоновом режиме выполняться.
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37751466
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В конце дня обратил внимание на такую вещь
Вообще мне нужно открывать не 1 рекодсет асинхронно, а 4
Значит, открываю последовательно в одной процедуре 4 рекодсета,
причем для их открытия существуют свои функция по концепции
эти функции одинаковые, но туда передаются разные условия для запроса,
все рекорсеты открываются с параметром adAsyncExecute
Коннект на клиенте
Первые 2 функции отрабатываются мгновенно 3-я задумывается на 30-120 сек
4 опять мгновенно. Почему?
Б.Д.-Access
Provider=Microsoft.Jet.OLEDB.4.0
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37751480
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что ты подразумеваешь под "отрабатывается". Время чисто на Open или время от Open до того, как рекордсет отрапортует о завершении выполнения запроса?
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37751494
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Shocker.Pro]Что ты подразумеваешь под "отрабатывается". Время чисто на Open или время от Open до того, как рекордсет отрапортует о завершении выполнения запроса?[/quot
В том смысле что есть 4-е функции они идут в процедуре Command_Click

ФункцияОткрытьРекорсет1 - здесь отрабатывается мгновенно
ФункцияОткрытьРекорсет2 - здесь отрабатывается мгновенно
ФункцияОткрытьРекорсет3 - вот здесь прогграмма зависает
ФункцияОткрытьРекорсет4

1 и 2 рекордсет еще не открыты, они открываются асинхронно впрочем как и 3 и 4
но на 3-ей функции комп почему-то задумывается
Функции идентичны по структуре
]
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37751522
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TpaBkaShocker.ProЧто ты подразумеваешь под "отрабатывается". Время чисто на Open или время от Open до того, как рекордсет отрапортует о завершении выполнения запроса?1 и 2 рекордсет еще не открыты, они открываются асинхронно впрочем как и 3 и 4
но на 3-ей функции комп почему-то задумываетсяТы не понял вопроса. Или я не понял ответа :)

Показываю на пальцах:
Допустим у тебя есть код с такой структурой:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
for i=1 to 4
  set rs = conn.Execute("execute sp"&i, adAsyncExecute)
  do while rs.State = adStateExecuting
      ' рисуешь прогресс бар и проверяешь отменяющую кнопку
     DoEvents
  loop

  if rs.State = adStateOpen then
    ' рапортуешь результат работы
  else
    ' запрос отменили или процедура упала с ошибкой
  end if
next


В этом случае, все хорошо и задержки выполнения (если они есть) будут по причине СУБД, надо будет смотреть текст хранимых процедур.

А если у тебя код типа такого:
Код: vbnet
1.
2.
3.
4.
set rs1 = conn.Execute("execute sp1", adAsyncExecute)
set rs2 = conn.Execute("execute sp2", adAsyncExecute)
set rs3 = conn.Execute("execute sp3", adAsyncExecute)
set rs4 = conn.Execute("execute sp4", adAsyncExecute)

А потом ты в цикле пытаешься ждать окончания всех четырех хранимок разом, то совершенно не важно какой там код внутри хранимых процедур. Ты упираешься в простую проблему: сервер не может выполнять несколько запросов одновременно от одного клиента . У тебя первый запрос уходит нормально, а второй (и последующие) либо А) падают с ошибкой "неправильнй порядок команд" которую ты игнорируешь, либо Б) драйвер неявно создает новые коннекты к базе и запускет все запросы в новом коннекте (а это выделение ресурсов на клиенте, на сервере, потеря на сетевое общение и тд), либо В) принудительно переводит тебя в синхронный режим (ждет окончания предудыщей команды, прежде чем послать следующую).
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37751882
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Код: vbnet
1.
2.
3.
4.
set rs1 = conn.Execute("execute sp1", adAsyncExecute)
set rs2 = conn.Execute("execute sp2", adAsyncExecute)
set rs3 = conn.Execute("execute sp3", adAsyncExecute)
set rs4 = conn.Execute("execute sp4", adAsyncExecute)



У меня вот этот вариант
Код: vbnet
1.
2.
я сначала запускаю все 4 на открытия, а затем в таймере проверяю (в таймере  стоит DoEvents )
If rs1.State = adStateOpen and rs2.State = adStateOpen .............


Кстати сначала тоже последовательно открывал рекордсеты и ожидал открытия каждого через цикл, ну как у тебя White Owl
только там еще в цикле проверялась переменная которая отвечает за отмену открытия рекордсета ну и последующий выход из процедуры
Но в итоге прога падала из за DoEvents без ошибок просто зависала и затем её винда закрывала

Сейчас еще раз все проверил, немного подшаманил с кодом и выходит что:
Код: vbnet
1.
2.
3.
4.
set rs1 = conn.Execute("execute sp1", adAsyncExecute)-1сек
set rs2 = conn.Execute("execute sp2", adAsyncExecute)-10сек
set rs3 = conn.Execute("execute sp3", adAsyncExecute)-1сек
set rs4 = conn.Execute("execute sp4", adAsyncExecute)-1сек


Проверял на 1,5 млн записей то есть запросы были без условий (бд находится у меня на компе)
так вот на открытие (то есть =adStateOpen ) всех 4 рекордсетов требуется около 40-60сек

То есть вроде все хорошо но вот на кнопку отмена нормально не получается нажать
как раз из-за
Код: vbnet
1.
set rs2 = conn.Execute("execute sp2", adAsyncExecute)-10сек


Просто здесь прога зависает и если кликать на кнопку отмена ноут начинает недовольн жужжать
И в итоге отменяет не сразу а через сек 10-15 но это все происходит когда в выборке больше
300 тыс. записей на маленьком количестве записей все ок
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37752194
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,
Спасибо я тебя услышал
Открываю рекордсеты асинхронно последовательно (у тебя 1 вариант),
но вместо цикла для проверки состояния рекордсета
использую процедуру в таймере с интервалом 500
Работает идеально!
От цикла пришлось отказаться, как я писал выше из-за DoEvents (прога падает)
А без DoEvents не обойтись, так как отмену нельзя передать в процедуру
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37752268
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да кстати вы правы
тоже заметил, что Cancel срабатывает не мгновенно,
а чем больше записей, тем дольше происходит отмена
Например отмена выборки на 1,5 млн записей (Б.Д. на сервере) происходит около 7 сек
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37752289
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TpaBkaА без DoEvents не обойтись, так как отмену нельзя передать в процедуру Да и незачем это. Можно изменить глобальную переменную, а в процедуре ее проверить.
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37752314
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TpaBkaа чем больше записей, тем дольше происходит отмена
Например отмена выборки на 1,5 млн записей (Б.Д. на сервере) происходит около 7 секразумеется, так как откатывается транзакция.

Я как-то сдуру запустил большой запрос на обновление на sql-сервере, когда через три часа я понял, что конца и края процессу нет - нажал отмену - так он еще три часа откатывался.

Что касается запросов на выборку, да еще и в Аксесс - тут не знаю.
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37752456
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyTpaBkaА без DoEvents не обойтись, так как отмену нельзя передать в процедуру Да и незачем это. Можно изменить глобальную переменную, а в процедуре ее проверить.
Ну да я так и делаю
Вот допустим есть цикл:
Код: vbnet
1.
2.
3.
4.
5.
BoolCancel = False
Do While rs.State = adStateExecuting
   'DoEvents
    If BoolCancel = True Then rs.Cancel
Loop

Цикл не даст нажать пользователю на кнопку и изменить BoolCancel = True если не будет DoEvents
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37752540
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем этот цикл, если запрос асинхронный?
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37752560
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА зачем этот цикл, если запрос асинхронный?дадада, я тут отвлекся от топика. можно просто ловить событие окончания исполнения запроса.
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37752585
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
)
так топик был создан чтобы узнать как отменить запрос до окончания его выполнения
...
Рейтинг: 0 / 0
Прервать выполнение запроса
    #37752607
TpaBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAntonariyА зачем этот цикл, если запрос асинхронный?дадада, я тут отвлекся от топика. можно просто ловить событие окончания исполнения запроса.
А кажется понял
попозже попробую
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Прервать выполнение запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]