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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сериализация QSqlQuery  (Прочитано 3118 раз)
ploop
Гость
« : Декабрь 17, 2013, 14:28 »

Собственно, вопрос в заголовке.
После выполнения запроса в QSqlQuery надо как-то вытянуть данные для передачи по сети. Если бы запросы были однотипные (с одинаковым набором полей) проблем бы не было, прогнал в цикле по записям и всё. Но структура такая: клиент даёт запрос серверу, сервер напрямую передаёт его БД, забирает результат, и этот результат (после анализа) должен передать клиенту. Объёмы небольшие, но запросы все разные.

И аналогично на клиенте надо десериализовать всё это дело, желательно восстановить структуру QSqlQuery или нечто подобное, для отображения (т.е. подцепить всё это к QSqlTableModel)
Реально?
Записан
popper
Гость
« Ответ #1 : Декабрь 17, 2013, 19:56 »

Как вариант:
на стороне сервера результаты запроса записываешь в контейнер типа QList<QHash<QString, QVariant> >, сереализуешь с помощью QDataStream и отправляешь клиенту.
Клиент востанавливает контейнер, далее:
Код
C++ (Qt)
 
QSqlTableModel model;
 
typedef QHash<QString, QVariant> T;
int row = 0;
foreach<T item, receivedList> {
QSqlRecord rec;
T::const_iterator i = item.constBegin();
while(i != item.constEnd()) {
  QSqlField field(i.key());
  field.setValue(i.value());
  rec.append(field);
   ++i;
 }
 model.setRecord(row, rec);
 ++row;
}
 
Записан
ploop
Гость
« Ответ #2 : Декабрь 17, 2013, 21:45 »

Хм... интересный вариант. Попробую завтра, спасибо.
Записан
ploop
Гость
« Ответ #3 : Декабрь 18, 2013, 17:42 »

Всё получилось. Просто забыл, что QDataStream отлично (де)сериализует QVariant'ы.
Суём в него количество записей, количество полей, и дальше в цикле variant'ные значения.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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