subscribeToNotification() и переменный NOTIFY |
Здравствуйте, гость ( Вход | Регистрация )
subscribeToNotification() и переменный NOTIFY |
RazrFalcon |
29.1.2013, 1:58
Сообщение
#1
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
Имеется база firebird и триггер вида:
Проблема в том, что не понятно как объяснить qt, что нотификация переменная строка, а не постоянная? Или qt не может с такими событиями работать?То есть, если бы я написал просто "CONTACTS_NOTIFY" - то все работает отлично, но мне нужно так же получать и новый id вместе с сигналом. PS: это все нужно, что бы после изменения базы не перезагружать всю модель снова в клиент, а только изменившиеся строки. Возможно есть другой метод, но я его не нашел. |
|
|
Litkevich Yuriy |
1.2.2013, 1:49
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Такой вариант не получится и не только в Qt.
БД шлёт уведомление, ПО по этому уведомлению смотрит, что изменилось. Можно смотреть самый большой ID-шник, например. |
|
|
RazrFalcon |
2.2.2013, 1:57
Сообщение
#3
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
Хм. А как тогда можно узнавать какие именно строки изменились? Что бы каждый раз всю таблицу не обновлять?
|
|
|
Litkevich Yuriy |
3.2.2013, 15:56
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
это скорее филосовский вопрос.
-- 1 -- Если ты используешь сигнализацию на уровне строк таблицы (т.е. из тригера), то в данной таблице имеет смысл завести вспомогательный столбец содержащий штамп времени последнего изменения, в тригере это значение должно обновляться. В приложении достаточно провести сравнение штампов времени, чтобы понять какие строки отличаются, а можно просто запросить у БД строки, у которых штамп времени больше чем, время последнего обновления. -- 2 -- Если используешь сигнализацию на уровне БД/Приложения (т.е. из хранимой процедуры), то может понадобится вспомогательная таблица. У меня (в процессе разработки систем сбора данных) появилась привычка, делать таблицу, которую я обзываю - "Летопись". Т.е. ни в каких таблицах я не держу полей типа - штамп времени (со встроенным типом данных - timestamp). А делаю таблицу: id | timestamp | where | what В эту таблицу, все тригерры и ХП обязаны заносить текущие дату-время, т.е. отмечать штамп времени всех событий. а в другие таблицы помещаются Id-шники из этой таблицы. поле "where" у меня содержит имя объекта БД (имя таблицы или ХП, но не тригера, т.к. он привязан к таблице) поле "what" даёт некое описание события (тут нужно придумать правило, что туда писать). Можно использовать эту вспомогательную таблицу для определения того, что изменилось в БД. |
|
|
RazrFalcon |
3.2.2013, 23:32
Сообщение
#5
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
Спасибо. Понятно.
Я подумав тоже решил делать доп таблицу, а оказывается распространенный подход. Только один момент. Синхронизация времени. То есть или на всех машинах-клиентах + сервер нужно иметь одно и тоже время, или брать время у сервера. |
|
|
Litkevich Yuriy |
5.2.2013, 17:13
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
или брать время у сервера да у него. Причём это довольно просто:
Где foo произвольная, существующая таблица, например: rdb$database (Взято из доки) |
|
|
RazrFalcon |
6.2.2013, 14:07
Сообщение
#7
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
Ясно. Спасибо.
|
|
|
Текстовая версия | Сейчас: 19.4.2024, 7:01 |