|
4 / 4 / 1
Регистрация: 03.12.2012
Сообщений: 55
|
|
Обойтись без использование глобальных переменных20.02.2013, 19:00. Показов 1740. Ответов 17
Метки нет (Все метки)
Столкнулся на этапе написания программы с тем что необходимо анализировать данные за разный промежуток времени. Т.е. я опрашиваю периодически БД на изменение. В запросе мне приходят данные, анализируя с предыдущими делаю вывод были ли изменения в БД. Но мне нужно хранить где то эти данные?
Добавлено через 10 минут Т.е. нужно хранить данные предыдущего опроса. Где их хранить?
0
|
|
| 20.02.2013, 19:00 | |
|
Ответы с готовыми решениями:
17
Получить значение переменной из потока без создания глобальных переменных Использование глобальных переменных |
|
4 / 4 / 1
Регистрация: 03.12.2012
Сообщений: 55
|
|
| 20.02.2013, 20:25 [ТС] | |
|
0
|
|
|
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
|
|
| 21.02.2013, 00:49 | |
|
doncelab, уточните Вашу БД.
По идее можно использовать триггеры. А данные частично (или в нужной форме) зеркалировать в ту же БД.
0
|
|
|
6 / 6 / 1
Регистрация: 01.06.2012
Сообщений: 107
|
||
| 21.02.2013, 08:26 | ||
|
Стой на пути более тонкого клиента.
0
|
||
|
4 / 4 / 1
Регистрация: 03.12.2012
Сообщений: 55
|
|
| 21.02.2013, 08:36 [ТС] | |
|
База у меня firebird 2.5, многопользовательская. Есть служебная таблица в ней 3 поля UPDATES INSERTS DELETES, есть триггеры которые автоматически увеличивают счетчики для каждой из изменяемых таблиц. Т.е. подключаются несколько клиентов и начинаю работать, те изменения которые я вношу и меняются у меня в клиенте, а отслеживаю я изменения других участников, и корректно подгружаю изменения.
0
|
|
|
6 / 6 / 1
Регистрация: 01.06.2012
Сообщений: 107
|
|
| 21.02.2013, 11:33 | |
|
Вапще всё круто, делаешь процедуру или функцию, что там в есть, чтобы могло сразу вернуть выборку, Просто вызываешь одну процедуру, а она автоматом проверяет, время когда ты делал последний раз обновление и есть ли изменения(у каждой записи, и у каждого изменения, должно быть такое понятие как dateimecreate и datetimeupdate или делать струтуру где нету не проводятся update а только добавление новых записей)...У меня автообновление везде так работает...Тоесть храню только одну переменную дату, кидаю в процедуру дату, а она возвращает данные, если нету новых данных не возвращаю. У меня к примеру нету смысла если небыло изменений перерисовывать дерево.
Но да конечно, если желание твоё сравнивать данные с таблицей, можешь создать вектор структур и делать сравнение. Но блин не красиво это. Но у тебя клиент серверная технология, используй её на 100% Есть ещё технология, в виде сервиса к СУБД, она может опавещать по tcp или http протоколу, находясь в процедуре или в тригере.
0
|
|
|
4 / 4 / 1
Регистрация: 03.12.2012
Сообщений: 55
|
|
| 21.02.2013, 15:31 [ТС] | |
|
У меня в базе к каждой таблице есть триггеры для каждого действия, которые увеличивают счетчик. Который я хочу анализировать и делать выводы об изменениях. dateimecreate и datetimeupdate я так понял что должны быть моими полями? Или есть служебные? Опишите поподробнее как реализовано у вас. Для меня такие технологии еще сложны, только разобрался с генераторами и триггерами. Я всегда думал что БД только для хранения данных, а они еще и оперируют этими данными.
Добавлено через 2 часа 35 минут Нашел компонент IBEvents который будет регистрировать события посылаемые БД при изменении Добавлено через 26 минут В триггерах на нужные действия ставим post_event 'UPDATE_TABLE';, а в компоненте прописываем действия на событие
0
|
|
|
6 / 6 / 1
Регистрация: 01.06.2012
Сообщений: 107
|
|
| 22.02.2013, 07:57 | |
|
Я так понимаю, что сейчас процесс только изучения клиент серверной технологии
Поэтому при работе с данными базами твоё приложение должно отвечать только за работу интерфейса. А всё остальное СУБД, только главное не давать на СУБД нагрузку, которая ему противопоказана(есть много литературы). Короче там чисто новые механизмы о них либо препод расказывает, либо долго мануалы, либо просто от одного к другому. Поэтому надо будет пиши в аську 405349195 Но в любом случае не с тригеров начинай! Забудь про все свои запросы писанные на SQL теперь только вызовы процедур и функций с параметрами из СУБД. В твоём клиенте не должно быть не одного SQL запроса.
0
|
|
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 22.02.2013, 09:49 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
А самое верное будет прикрутить к началу каждой таблицы дополнительное поле, куда складывать значение даты/времени последнего внесения изменений, как предлагает doncelab, а в самой программе, как предлагает Avazart, хранить только не копию всех полей, а булевскую структуру с флагами только тех полей, которые данный конкретный клиент изменяет. По какому-нибудь событию (таймеру) каждый клиент будет проверять первое поле таблицы на предмет наличия изменений времени последнего редактирования таблицы, и если изменения есть, обновлять свою копию времени изменения и, самое главное, считывать только те поля, которые имеются в его структуре. Те, от изменения которых зависти логика его работы, а на остальные будет забивать.
Можно пойти дальше и прикрутить в таблице к каждому столбцу по флагу. И, по изменению времени таблицы, считывать флаг интересующего нас столбца, и, к примеру, если нам нужно из таблицы только имя, а с остальным мы в данный момент не работаем, то будет всего два обращения к точно известным строкам таблицы, что сильно увеличит скорость работы. Самое же лучшее это создать дополнительную таблицу, содержащую информацию о изменениях этой таблицы и вообще только к ней и обращаться.
1
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
78 / 78 / 6
Регистрация: 18.06.2009
Сообщений: 533
|
||||||
| 22.02.2013, 13:49 | ||||||
|
Без знаний СУБД будет тяжко
но можно ![]() Если оракл то есть псевдоколонка "номер последней транзакции которая его изменила". по умолчанию ведется на весь блок, но можно персонально для отдельной таблицы включть индивидуально на строку. в Mssql/sybase есть timestamp , когда в строку внесено изменение а перенос данных - отоборать данные по данной колонке есть такое понятие upsert: сделать update на одну строку, и если этот update не затронул ни одну строку, сделать insert в ДРУГУЮ ВРЕМЕННУЮ ТАБЛИЧКУ ,когда ты справил свои нужды делаешь TRUNCATE TABLE своей временной таблички.Пример upsert
0
|
||||||
|
4 / 4 / 1
Регистрация: 03.12.2012
Сообщений: 55
|
|
| 25.02.2013, 18:56 [ТС] | |
|
Большое спасибо всем участникам, реализовал на эвентах оповещение о новых или измененных записях и выборкой только их. Но вот как узнать о удаленной записи? Ведь её уже нет, а если ставить флаг удаления то это уже получается модификация.
0
|
|
|
78 / 78 / 6
Регистрация: 18.06.2009
Сообщений: 533
|
|
| 25.02.2013, 19:03 | |
|
Ну влюбом случае тебе нужно ведь где-то хранить,что такая запись ведь была....
Либо использовать встроенные средства АУДИТА сервера,но опять же, Аудит зачастую - и есть системная табличка,где можно отображать,кто,где,когда что-то изменил или сделал выборку.
0
|
|
|
4 / 4 / 1
Регистрация: 03.12.2012
Сообщений: 55
|
|
| 25.02.2013, 19:39 [ТС] | |
|
У меня при создании или редактировании в соответствующем поле ставится метка с помощью генератора, а при загрузки базы я узнаю максимальные значения и уже могу сделать выборку только измененных или созданных строк, а вот с удалением?
0
|
|
|
6 / 6 / 1
Регистрация: 01.06.2012
Сообщений: 107
|
|
| 26.02.2013, 08:39 | |
|
А смотря где удаление. Создай некую корзину(таблицу), и будешь туда скидывать записи, из одной таблицы удалять в другую вставлять. Тем самым задача будет выполнена.
0
|
|
|
78 / 78 / 6
Регистрация: 18.06.2009
Сообщений: 533
|
|
| 26.02.2013, 12:24 | |
|
doncelab, Я же говорю, ты работаешь с "флагом", тебе нужно же что-то инное, принцип "башен ханоя" в данном случае промежуточная таблица,то что у тебя есть сейчас,тебе прийдеться переделывать.
0
|
|
|
4 / 4 / 1
Регистрация: 03.12.2012
Сообщений: 55
|
|
| 26.02.2013, 18:57 [ТС] | |
|
Спасибо всем я реализовал все. Удаление сделал через триггер в UPDATE в котором определяется удаляю запись или изменяю. Удаляю через флаг, так как мне нужно оставлять удаленные записи.
0
|
|
| 26.02.2013, 18:57 | |
|
Помогаю со студенческими работами здесь
18
Использование глобальных переменных Использование глобальных переменных Использование глобальных переменных - моветон ли? Использование глобальных переменных объявленных в другом файле Исправить без использования глобальных переменных Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает
Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|