Russian Qt Forum

Qt => Базы данных => Тема начата: ploop от Декабрь 17, 2013, 14:28



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

И аналогично на клиенте надо десериализовать всё это дело, желательно восстановить структуру QSqlQuery или нечто подобное, для отображения (т.е. подцепить всё это к QSqlTableModel)
Реально?


Название: Re: Сериализация QSqlQuery
Отправлено: popper от Декабрь 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;
}
 


Название: Re: Сериализация QSqlQuery
Отправлено: ploop от Декабрь 17, 2013, 21:45
Хм... интересный вариант. Попробую завтра, спасибо.


Название: Re: Сериализация QSqlQuery
Отправлено: ploop от Декабрь 18, 2013, 17:42
Всё получилось. Просто забыл, что QDataStream отлично (де)сериализует QVariant'ы.
Суём в него количество записей, количество полей, и дальше в цикле variant'ные значения.