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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Готовые модули для просмотра и редактирования БД  (Прочитано 19714 раз)
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« : Сентябрь 22, 2017, 11:01 »

Сабж? Вроде и писать не сложно, но может готовое что есть?
есть БД, есть списки с подробным описанием таблиц и полей на русском, нужна форма которая сделает окно просмотра таблицы.
Аналогично нужна форма редактирования таблицы, с возможностью отмены, контролем что данные в таблице не изменились перед внесением изменений... (если данные изменились то сделать слияние как в git)
Записан
vic57
Чайник
*
Offline Offline

Сообщений: 90


Просмотр профиля
« Ответ #1 : Сентябрь 22, 2017, 11:15 »

QSqlQueryModel, QSqlTableModel чем не подходят?
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #2 : Сентябрь 27, 2017, 11:22 »

Для mssql изменения не сохраняются.
А вот такой вопрос: пользователь загрузил таблицу локально, отредактировал теперь он отсылает на сервер. Как проверить что на сервере таблица не изменилась?
Можно ли в запрос на изменения добавить запрос на проверку?  Например 2 пользователя одновременно проверили что таблица не изменилась, первый залил изменения, а второй испортил данные(так как думал что заливает на неизмененную таблицу).
Записан
vic57
Чайник
*
Offline Offline

Сообщений: 90


Просмотр профиля
« Ответ #3 : Сентябрь 27, 2017, 12:42 »

вставить можно все что угодно. я на изменение/удаление делал отдельный диалог с подтверждением действия. БД не будет думать за вас, бизнес-логику на клиенте самому надо делать.
например делать цепочку select/update - сначала видите то, что хотите изменить, потом меняеете

 
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



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

Меня вот какой вопрос смущает. Допустим в таблице есть 2 поля Scoda Touareg. Первый пользователь исправляет Scoda->Wolksvagen, а второй одновременно Touareg->Octavia, проверка у них произошла одновременно и получилось Wolksvagen Octavia или данные первого пользователя затрутся?
но тогда допустим есть еще поля в которые 2 пользователя вбивали технические характеристики и тогда теряются данные первого пользователя.

Можно ли считать таблицу, а записать только если таблица не изменилась с момента чтения?
Записан
vic57
Чайник
*
Offline Offline

Сообщений: 90


Просмотр профиля
« Ответ #5 : Сентябрь 27, 2017, 19:24 »

Меня вот какой вопрос смущает. Допустим в таблице есть 2 поля Scoda Touareg. Первый пользователь исправляет Scoda->Wolksvagen, а второй одновременно Touareg->Octavia, проверка у них произошла одновременно и получилось Wolksvagen Octavia или данные первого пользователя затрутся?
но тогда допустим есть еще поля в которые 2 пользователя вбивали технические характеристики и тогда теряются данные первого пользователя.
Можно ли считать таблицу, а записать только если таблица не изменилась с момента чтения?
ну это из серии - кто будет сторожить того кто будет сторожить
имхо я бы сделал поле user_id для каждого юзера, имеющего право на update например
http://webew.ru/articles/1383.webew
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Сентябрь 28, 2017, 06:13 »

deMax, если редактируют одну таблицу или несколько таблиц связанных ключами, то БД не позволит одновременный доступ.
Т.е. один из пользователей получит сообщение об ошибке, либо после попытке сохранить данные увидит всё в исходном состоянии.
Записан

Юра.
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #7 : Сентябрь 28, 2017, 08:11 »

deMax, если редактируют одну таблицу или несколько таблиц связанных ключами, то БД не позволит одновременный доступ.
Т.е. один из пользователей получит сообщение об ошибке, либо после попытке сохранить данные увидит всё в исходном состоянии.
А одновременно и не будет, считали что БД не изменилась, у второго лагнула сеть и он sql-запрос на изменения послал позже. Можно ли в одном запросе проверить что данные не изменились и только тогда вносить изменения? Потому что если запроса 2, между считал данные данные (локально проверил) и внес изменения кто то может эти данные изменить.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #8 : Сентябрь 28, 2017, 08:13 »

Запрос QSqlDatabase при соединении и запросе останавливает gui. Его в поток выносить отдельный? Каждый запрос в отдельном потоке? Есть готовые решения?
Записан
vic57
Чайник
*
Offline Offline

Сообщений: 90


Просмотр профиля
« Ответ #9 : Сентябрь 28, 2017, 09:04 »

http://doc.qt.io/Qt-5/examples-sql.html
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #10 : Сентябрь 28, 2017, 09:24 »

И где там потоки(в папке примеров sql слово thread не найдено)? Виснущий GUI пока идет обращение к БД не очень актуально.
Записан
Bepec
Гость
« Ответ #11 : Сентябрь 28, 2017, 10:53 »

В потоки шмалять. По другому никак не получается.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #12 : Сентябрь 28, 2017, 11:14 »

И какой класс потока выбрать для mssql? QtConcurrent, QThread...
Для каждого запроса создавать поток или в один поток запросы кидать(через очередь)?
В принципе бд не нагруженная, главное чтоб гуи при подключении и запросах не вис. Как отменить db->open() в потоке?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #13 : Сентябрь 28, 2017, 13:47 »

>Для каждого запроса создавать поток
Надо не запрос, а соединение (QSqlDatabase) поместить в отдельный поток (moveToThread)
Записан

Юра.
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Надо не запрос, а соединение (QSqlDatabase) поместить в отдельный поток (moveToThread)
QSqlDatabase не является наследником QObject, поэтому у него нет метода moveToThread.
А так да, для каждой нитки нужно создавать отдельное подключение.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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