Russian Qt Forum

Qt => Общие вопросы => Тема начата: demaker от Сентябрь 08, 2016, 15:00



Название: QSqlQuery выполнение нескольких запросов подряд
Отправлено: demaker от Сентябрь 08, 2016, 15:00
Пытаюсь  сделать серию запросов к базе

Накапливаю запросы
Код
C++ (Qt)
bool DataBaseModel::setData(const QModelIndex &index, const QVariant &value, int role)
{  
   if(index.isValid()){
       dataRecords.at(index.row())->operator [](index.column()) = value.toString();
       if(index.row() < startCountRecords){            
           qDebug()<<"UPDATE...";
           //создаем список запрос на updaet на каждую ячейку
           //ставим фильтр запросов если index-ячейки для предидущего запроса совпадает с текущим,
           //то предыдущий удаляем из списка. QHash updateQuery<index,QSqlQuery *>
 
           QSqlQuery *query = new QSqlQuery;
           query->prepare("UPDATE ALGORITHMS SET " + sqlModel->record().fieldName(index.column()) + " = ? WHERE CODE = ?");
           query->addBindValue(value);
           const QModelIndex indexCode = QAbstractTableModel::index(index.row(),0,QModelIndex());
           int code = data(indexCode,Qt::DisplayRole).toInt();
           qDebug()<<"code = "<<code;
           query->addBindValue(QVariant(code));
 
           QList<QModelIndex> listKeys = updateQuery.keys();
           if(!listKeys.isEmpty()){
               for(int i = 0; i<listKeys.count(); i++){
                   if(listKeys.at(i) == index){
                       QSqlQuery *query = updateQuery[index];
                       qDebug()<<"remove setData";
                       qDebug()<<updateQuery.remove(index);
                       delete query;
                       break;
                   }
               }
           }
           updateQuery.insert(index,query);
       }
       return true;
   }
   return false;
}
 

Исполняем по нажатию
Код
C++ (Qt)
void DataBaseModel::updateDataInBase()
{
   qDebug()<<__FUNCTION__;
   QList<QModelIndex> listKeys = updateQuery.keys();
   if(!listKeys.isEmpty()){
       for(int i = 0; i<listKeys.count(); i++){
           QSqlQuery *query = updateQuery[listKeys.at(i)];
           qDebug()<<query->exec();
           qDebug()<<"remove updateDataInBase";
           qDebug()<<updateQuery.remove(listKeys.at(i));
           delete query;
       }
   }
}
 

Но к сожалению иногда при выполнении запроса выдается false не могу понять почему  ???


Название: Re: QSqlQuery выполнение нескольких запросов подряд
Отправлено: GraninDm от Сентябрь 09, 2016, 15:35
Включите логгирование на сервере и посмотрите.
Либо SQLError смотрите.


Название: Re: QSqlQuery выполнение нескольких запросов подряд
Отправлено: break от Сентябрь 09, 2016, 17:15
У вас в любом случае неправильный подход - вам надо в setData модели менять кеш данных модели, а уже потом применять эти изменения в БД. Если бы у вас была возможность управления транзакциями, то можно было бы прямо в setData выполнять запросы на изменение данных, но транзакцию подтверждать или отменять уже по команде пользователя по окончанию редактирования. Хранить экземпляры QSqlQuery в контейнере это точно не гуд...


Название: Re: QSqlQuery выполнение нескольких запросов подряд
Отправлено: demaker от Сентябрь 11, 2016, 20:57
У вас в любом случае неправильный подход - вам надо в setData модели менять кеш данных модели, а уже потом применять эти изменения в БД.

Скажите а кеш данных модели, вы имейте ввиду просто список данных модели.
Или конкретно что ???


Название: Re: QSqlQuery выполнение нескольких запросов подряд
Отправлено: break от Сентябрь 13, 2016, 14:46
Цитировать
Скажите а кеш данных модели, вы имейте ввиду просто список данных модели.
Кеш это данные модели, которые дублируют данные в бд.


Название: Re: QSqlQuery выполнение нескольких запросов подряд
Отправлено: demaker от Октябрь 03, 2016, 14:48
Спасибо за разъяснение