Russian Qt Forum

Qt => Базы данных => Тема начата: Dp0H от Ноябрь 06, 2009, 23:25



Название: Нормальная работа с БД
Отправлено: Dp0H от Ноябрь 06, 2009, 23:25
Здравствуйте всем.
Столкнулся с реализацией клиента БД на Qt. Благо дело, задача мизерная (регистрация событий на проходной в базе) и легко решилась с помощью массивов. Но есть желание попытаться перевести крупный проект c .NET на Qt ради кросплатформенности. И вот возникает ключевое непонимание - как реализовать работу с БД. В чем суть...
Обычная картина: имеем выборку (результат выполнения запроса к нескольким таблицам, результат выполнения процедуры и т.п. - в общем случае это просто скрипт). Предвкушая посыл к QSqlRelationalTableModel - справочники слишком велики, чтобы грузится на клиента.
Окно редактирования записи такой выборки реализует работу со справочниками так же - клиент получает необходимый минимум. Далее - возможные действия с выборкой - INSERT, UPDATE, DELETE - реализуются так же абстрактными запросами, которые могут представлять собой как атомарные инструкции, так и вызов процедур или целый скрипт. В результате вставки или изменения конкретная запись сразу же обновляет свое представление в интерфейсе клиента с помощью данных, полученных в результате выполнения соотв. команды или последующей команды (чтобы нарисовать значения из справочников, ссылки на которые воткнулись в текущую запись в результате вставки/модификации).
Не хотелось бы тыкать пальцем, но придется таки ткнуть в давно придуманные и хорошо сделанные велосипеды:
http://www.devart.com/ru/dac.html - VCL-компоненты (когда они начинали, по-моему .NET еще не было)
(Sql/Odbc и т.п.)DataAdapter в .NET
Для DataAdapter на каждое действие создаются команды типа
Код:
DA.InsertCommand = new SqlCommand(
@"
  DECLARE @ID int, @StructureID int
  SET @StructureID = GladeO.MyStructureID()
  INSERT into GladeA.Client ([Name], StructureID) values (@Name, @StructureID);
  SET @ID = scope_identity();
  EXEC GladeA.ClientSelect @ID = @ID;
", dbConnection);
DA.InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord;
В процессе редактирования таблицы накапливаются данные о совершенных действиях, и потом заливаются соответственно в базу (можно накопить, можно сразу - не суть вопроса). Суть вопроса - есть ли такой же велосипед в Qt, или его надо изобретать начиная с колеса?! По крайней мере, я не нашел способа реализации такого поведения на основе той прослойки для работы с БД, которая уже есть в Qt.
Заранее спасибо за советы и тыканье носом куда следует.


Название: Re: Нормальная работа с БД
Отправлено: lit-uriy от Ноябрь 07, 2009, 01:03
Готового нет, можно сделать модель на основе QSqlQueryModel.


Название: Re: Нормальная работа с БД
Отправлено: crossly от Ноябрь 09, 2009, 12:53
tablemodel может сразу.... может кэшировать строку.... може кэшировать все....


Название: Re: Нормальная работа с БД
Отправлено: break от Ноябрь 09, 2009, 14:09
Если не трудно опишите саму задачу - хоть образно - то есть то конечное с чем столкнуться пользователи, просто вы сказали что справочники на основе TableModel или RelationTableModel не получается т.к. они "выкачивают" все на клиента - но на самом деле это не так - полный селект делается только в случае необходимости -= если например пользователь проходит от первой записи к последней. Вообще интерфейс надо подрузумевать так чтобы у пользователя была возможность работы с небольшими группами записей - скажем селект по буквам алфавита и т.д. Прям не верится что имеет смысл изобрнетатьт или искать велосипед...