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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSqlQuery выполнение нескольких запросов подряд  (Прочитано 4393 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« : Сентябрь 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 не могу понять почему  Непонимающий
« Последнее редактирование: Сентябрь 08, 2016, 15:54 от demaker » Записан
GraninDm
Гость
« Ответ #1 : Сентябрь 09, 2016, 15:35 »

Включите логгирование на сервере и посмотрите.
Либо SQLError смотрите.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #2 : Сентябрь 09, 2016, 17:15 »

У вас в любом случае неправильный подход - вам надо в setData модели менять кеш данных модели, а уже потом применять эти изменения в БД. Если бы у вас была возможность управления транзакциями, то можно было бы прямо в setData выполнять запросы на изменение данных, но транзакцию подтверждать или отменять уже по команде пользователя по окончанию редактирования. Хранить экземпляры QSqlQuery в контейнере это точно не гуд...
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #3 : Сентябрь 11, 2016, 20:57 »

У вас в любом случае неправильный подход - вам надо в setData модели менять кеш данных модели, а уже потом применять эти изменения в БД.

Скажите а кеш данных модели, вы имейте ввиду просто список данных модели.
Или конкретно что Непонимающий
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #4 : Сентябрь 13, 2016, 14:46 »

Цитировать
Скажите а кеш данных модели, вы имейте ввиду просто список данных модели.
Кеш это данные модели, которые дублируют данные в бд.
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #5 : Октябрь 03, 2016, 14:48 »

Спасибо за разъяснение
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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