Russian Qt Forum

Qt => Базы данных => Тема начата: Varan от Февраль 14, 2012, 12:38



Название: после установки QSqlQuery в QSqlQueryModel перестаёт работать next()
Отправлено: Varan от Февраль 14, 2012, 12:38
Если после создания и выполнения QSqlQuery установить её в QSqlQueryModel, то почему-то перестаёт работать QSqlQuery::next().
Странно, потому что в QSqlQueryModel::setModel() вроде передаётся константная ссылка. Что я делаю не так?
Код
C++ (Qt)
QSqlQuery query;
query.exec("<select-запрос>");
 
query.bindValue(":unit_id", params.unit);
query.bindValue(":actual", 1);
query.exec();
// если две след. строки убрать, то next() выполняется
QSqlQueryModel m;
m.setQuery(query);
 
if (query.next()) // не выполняется
{


Название: Re: после установки QSqlQuery в QSqlQueryModel перестаёт работать next()
Отправлено: Tonal от Февраль 15, 2012, 08:55
Все копии QSqlQuery разделяют общее состояние.
Внутри setQuery происходит копирование запроса и заполнение модели, что приводит к изменению состояния и исходного объекта, т. к. изменилось их разделяемое состояние.
Вообще-то это протекание абстракции и либо должно быть исправлено, либо описано в документации. :)
На это намекает дока по setQuery, где написано, что запрос должен быть активным...

Т. е. твоя проблема решается заведением второго объекта запроса (не копированием).


Название: Re: после установки QSqlQuery в QSqlQueryModel перестаёт работать next()
Отправлено: Varan от Февраль 15, 2012, 10:05
Спасибо за ответ.
Т.е. надо сделать ещё один экземпляр QSqlQuery и снова для него вызывать exec()?


Название: Re: после установки QSqlQuery в QSqlQueryModel перестаёт работать next()
Отправлено: Пантер от Февраль 15, 2012, 10:10
Т.е. надо сделать ещё один экземпляр QSqlQuery и снова для него вызывать exec()?
Да. А зачем оно тебе, если есть модель? У нее и запрашивай данные.