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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Нормальная работа с БД  (Прочитано 3648 раз)
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.
Заранее спасибо за советы и тыканье носом куда следует.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Ноябрь 07, 2009, 01:03 »

Готового нет, можно сделать модель на основе QSqlQueryModel.
Записан

Юра.
crossly
Гость
« Ответ #2 : Ноябрь 09, 2009, 12:53 »

tablemodel может сразу.... может кэшировать строку.... може кэшировать все....
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #3 : Ноябрь 09, 2009, 14:09 »

Если не трудно опишите саму задачу - хоть образно - то есть то конечное с чем столкнуться пользователи, просто вы сказали что справочники на основе TableModel или RelationTableModel не получается т.к. они "выкачивают" все на клиента - но на самом деле это не так - полный селект делается только в случае необходимости -= если например пользователь проходит от первой записи к последней. Вообще интерфейс надо подрузумевать так чтобы у пользователя была возможность работы с небольшими группами записей - скажем селект по буквам алфавита и т.д. Прям не верится что имеет смысл изобрнетатьт или искать велосипед...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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