Russian Qt Forum

Qt => Базы данных => Тема начата: trot от Январь 07, 2011, 00:00



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


Название: Re: Как прервать запрос к БД
Отправлено: asrael от Январь 07, 2011, 00:21
Может, использовать таймер? Если время больше заданного, то отключать пользователя от базы..


Название: Re: Как прервать запрос к БД
Отправлено: NicK от Январь 07, 2011, 11:34
Пользователь выполнет запросы к БД. Запросы он формирует сам. Как корректно прерывать длительные запросы.
Запросы выполняются через QSqlQuery::exec(QString).

Присоединяюсь к вопросу. Возможно ли вообще по желанию пользователя прерывать длительные запросы к БД (например, по нажатию кнопки "Отмена").
Обязательно ли знать id запущенного SQL процесса для его прерывания? Будет ли запрос работать после отключения пользователя от базы или временного отключения от сети?(ведь запущенный запрос все-равно выполняется на сервере). Понимаю, что вопрос больше по SQL, чем по Qt, но все-таки, может кто подкинет пару идей или ткнет носом в нужную ссылку, например).


Название: Re: Как прервать запрос к БД
Отправлено: asrael от Январь 07, 2011, 12:11
Тогда, что за SQL вы используете?


Название: Re: Как прервать запрос к БД
Отправлено: lit-uriy от Январь 07, 2011, 13:41
>>то отключать пользователя от базы..
а как это делать?


Название: Re: Как прервать запрос к БД
Отправлено: asrael от Январь 07, 2011, 14:16
>>то отключать пользователя от базы..
а как это делать?
я как-то хотел сделать что-то подобное, ну, кнопку "отмена" для длительных операций. я юзал sqlite, тогда в документации нашел тему Interrupt A Long-Running Query (http://www.sqlite.org/c3ref/interrupt.html (http://www.sqlite.org/c3ref/interrupt.html)), но не смог раскурить, как это в QT реализовать и плюнул..
пробовал просто создавать новое соединение с базой, закрывая тем самым старое, но программа ругалась и схлопывалась.. :D


Название: Re: Как прервать запрос к БД
Отправлено: White Owl от Январь 11, 2011, 00:25
Универсального решения нет.
У некоторых баз данных, в родном интерфейсе есть возможность отмены команды. По непонятной причине, QSqlDriver не имеет стаба для такой операции.

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