-Поиск по дневнику

Поиск сообщений в rss_sql_ru_access_programming

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 16.03.2006
Записей:
Комментариев:
Написано: 4


Асинхронный запрос к серверу

Четверг, 22 Декабря 2016 г. 20:13 + в цитатник
Нужен совет знатоков, идея, ссылка.
Как запустить асинхронный запрос, который не возвращает записи, а скажем запускает хранимую процедуру на серверу мне известно. Но как запустить асинхронно запрос, возвращающий некие данные, да ещё таким образом, чтобы в случае чего пользователь мог бы прервать запрос?

Биллинг крутиться на ORACLE 11g. Таблицы на сервере огромные (есть и такие, где больше 100 млн. записей). Поэтому многие запросы работают очень и очень медленно (бывает и больше часа).
Что я сделал?
В отдельной таблице храню тексты запросов. По нажатию кнопки открывается форма, куда пользователь вводит нужные ему параметры и после нажатия кнопки, программа находит нужный SQL текст запроса из той таблицы, подставляет нужные параметры и запускает запрос к серверу. Вот тут у меня самое узкое место. Бывает, что пользователь ошибся с параметром и хочет перезапустить запрос. Но не тут то было! Никакой Break, Ctrl + Break и долгое удержание Esc не помогает. Только и только убить через task manager и звонок администратору базы Oracle, чтобы тот удалил висячую сессию.
И самое ужасное пока крутиться запрос в Access'е нечего делать, только курить и плевать в потолок.
Прочёл несколько топиков, где советуют использовать ADODB асинхронно. ОК. Не вопрос, ADO значит ADO. Но вот не могу врубиться, как потом результат вывести пользователю и как поджидать нужное время когда запрос будет готов?
Создавать временные таблицы с тем, чтобы полученные данные хранить там - не вариант. Дело в том, что в Oracle нет временных таблиц, на самом деле все таблицы постоянные, их не создают "на лету". Да и для этого нужно быть админом в Oracle. А я всего лишь "читатель" там. :(

Сейчас пытаюсь реализовать вот такую идею:
1) В MS Access создаю глобальную переменную с типом данных ADODB.Recordset
2) После нажатия кнопки программа не запускает запрос к серверу, а запускает VB скрипт, который и будет коннектиться к серверу ORACLE (правда придётся переспрашивать у пользователя логин и пароль), использует именно ту глобальную переменную рекордсет и попробует асинхронно получить данные и на этом работа VB скрипта заканчивается.
3) Таймером формы проверяю состояние рекордсета. Если набор записей готов, то как-нибудь нужно пользователю передать в виде таблицы.
Тут ещё и такой момент реализовать надо. Если пользователь передумал, то как-то всё нужно прекратить. Ну уберу таймер. Рекордсет приравняю на "ничего" (Nothing).
Пока не всё гладко получается. Многовато ошибок, да и работает нестабильно.

Может кто столкнулся с такой проблемой и решил как-то получше?

http://www.sql.ru/forum/1243740/asinhronnyy-zapros-k-serveru


 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку