Russian Qt Forum
Ноябрь 24, 2024, 11:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как прервать запрос к БД  (Прочитано 5182 раз)
trot
Гость
« : Январь 07, 2011, 00:00 »

Пользователь выполнет запросы к БД. Запросы он формирует сам. Как корректно прерывать длительные запросы.
Запросы выполняются через QSqlQuery::exec(QString).
Записан
asrael
Гость
« Ответ #1 : Январь 07, 2011, 00:21 »

Может, использовать таймер? Если время больше заданного, то отключать пользователя от базы..
Записан
NicK
Гость
« Ответ #2 : Январь 07, 2011, 11:34 »

Пользователь выполнет запросы к БД. Запросы он формирует сам. Как корректно прерывать длительные запросы.
Запросы выполняются через QSqlQuery::exec(QString).

Присоединяюсь к вопросу. Возможно ли вообще по желанию пользователя прерывать длительные запросы к БД (например, по нажатию кнопки "Отмена").
Обязательно ли знать id запущенного SQL процесса для его прерывания? Будет ли запрос работать после отключения пользователя от базы или временного отключения от сети?(ведь запущенный запрос все-равно выполняется на сервере). Понимаю, что вопрос больше по SQL, чем по Qt, но все-таки, может кто подкинет пару идей или ткнет носом в нужную ссылку, например).
Записан
asrael
Гость
« Ответ #3 : Январь 07, 2011, 12:11 »

Тогда, что за SQL вы используете?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Январь 07, 2011, 13:41 »

>>то отключать пользователя от базы..
а как это делать?
Записан

Юра.
asrael
Гость
« Ответ #5 : Январь 07, 2011, 14:16 »

>>то отключать пользователя от базы..
а как это делать?
я как-то хотел сделать что-то подобное, ну, кнопку "отмена" для длительных операций. я юзал sqlite, тогда в документации нашел тему Interrupt A Long-Running Query (http://www.sqlite.org/c3ref/interrupt.html), но не смог раскурить, как это в QT реализовать и плюнул..
пробовал просто создавать новое соединение с базой, закрывая тем самым старое, но программа ругалась и схлопывалась.. Веселый
Записан
White Owl
Гость
« Ответ #6 : Январь 11, 2011, 00:25 »

Универсального решения нет.
У некоторых баз данных, в родном интерфейсе есть возможность отмены команды. По непонятной причине, QSqlDriver не имеет стаба для такой операции.

В принципе, можно использовать связку:
Код:
 QVariant v = db.driver()->handle();
 sqlite3 *handle = *static_cast<sqlite3 **>(v.data());
 sqlite3_interrupt(handle);
Похожий код я использую в ASE/CtLib. Криво конечно, но работает.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.