есть база Access, и две проги работающие с этой базой, доступ через ADO, провайдер Microsoft.Jet.OLEDB.4.0. Из одной программы данные пишуться в базу, а в другой они отображаются,....надо сделать так чтобы после изменения данных первой прогой изменения были видны во второй, но так чтобы не писать ADODataSet.Close; ADODataSet.Open;
Пытался использовать динамические курсоры, но при установки свойства ADODataSet.CursorType = ctDynamic база загрывается, а если её открыть то курсор сам становиться = ctStatic
Здравствуйте, Аноним, Вы писали:
А>есть база Access, и две проги работающие с этой базой, доступ через ADO, провайдер Microsoft.Jet.OLEDB.4.0. Из одной программы данные пишуться в базу, а в другой они отображаются,....надо сделать так чтобы после изменения данных первой прогой изменения были видны во второй, но так чтобы не писать ADODataSet.Close; ADODataSet.Open; А>Пытался использовать динамические курсоры, но при установки свойства ADODataSet.CursorType = ctDynamic база загрывается, а если её открыть то курсор сам становиться = ctStatic
Попробуйте использовать ADODataSet.UpdateBatch(arAll), например, вместо ADODataSet.Close; ADODataSet.Open;
Здравствуйте, ALeonid, Вы писали:
AL>Здравствуйте, Аноним, Вы писали:
А>>есть база Access, и две проги работающие с этой базой, доступ через ADO, провайдер Microsoft.Jet.OLEDB.4.0. Из одной программы данные пишуться в базу, а в другой они отображаются,....надо сделать так чтобы после изменения данных первой прогой изменения были видны во второй, но так чтобы не писать ADODataSet.Close; ADODataSet.Open; А>>Пытался использовать динамические курсоры, но при установки свойства ADODataSet.CursorType = ctDynamic база загрывается, а если её открыть то курсор сам становиться = ctStatic
AL>Попробуйте использовать ADODataSet.UpdateBatch(arAll), например, вместо ADODataSet.Close; ADODataSet.Open;
ADODataSet.Requery?
... << RSDN@Home 1.2.0 alpha rev. 0>> А в Winamp'e: Enigma — Far behind the skies
Дункан Маклауд любил ходить в лес и издеваться над кукушками.
138385660
Здравствуйте, <Аноним>, Вы писали:
А>есть база Access, и две проги работающие с этой базой, доступ через ADO, провайдер Microsoft.Jet.OLEDB.4.0. Из одной программы данные пишуться в базу, а в другой они отображаются,....надо сделать так чтобы после изменения данных первой прогой изменения были видны во второй, но так чтобы не писать ADODataSet.Close; ADODataSet.Open; А>Пытался использовать динамические курсоры, но при установки свойства ADODataSet.CursorType = ctDynamic база загрывается, а если её открыть то курсор сам становиться = ctStatic
1)ADO автоматом меняет тип курсора если его не поддерживает провайдер
2)можно попробовать сменить CursorLocation на clUseServer и в нем пробовать отловить изменения набора данных
не знаю что получится — напиши !
но кстати на этот тип курсора накладываются ограничения
3)Requery сделать не сложно — ключевой когда ?
в IB-FB можно типа подписаться на событие ...
но Access оповещений не рассылает ?
можно конечно перейти на 3 звенку и возложить эту обязанность на сервер приложений
Здравствуйте, Sergey__, Вы писали:
S__>Здравствуйте, <Аноним>, Вы писали:
А>>есть база Access, и две проги работающие с этой базой, доступ через ADO, провайдер Microsoft.Jet.OLEDB.4.0. Из одной программы данные пишуться в базу, а в другой они отображаются,....надо сделать так чтобы после изменения данных первой прогой изменения были видны во второй, но так чтобы не писать ADODataSet.Close; ADODataSet.Open; А>>Пытался использовать динамические курсоры, но при установки свойства ADODataSet.CursorType = ctDynamic база загрывается, а если её открыть то курсор сам становиться = ctStatic
S__>1)ADO автоматом меняет тип курсора если его не поддерживает провайдер
S__>2)можно попробовать сменить CursorLocation на clUseServer и в нем пробовать отловить изменения набора данных S__>не знаю что получится — напиши ! S__>но кстати на этот тип курсора накладываются ограничения
Толку будет мало. Тоесть никакого, для даной задачи
S__>3)Requery сделать не сложно — ключевой когда ? S__>в IB-FB можно типа подписаться на событие ... S__>но Access оповещений не рассылает ? S__>можно конечно перейти на 3 звенку и возложить эту обязанность на сервер приложений
Думаю это уже поздно, у него две проги как никак, хотя зависит от размеров
1. Получать уведомлдения — для Client-Server приложения как то трудновато (читай нереально). Разве что подключить обе проги на Message Queue (MSMQ например) или пересылать Broadcast через UDP.
Проще это сделать просто умным рефрешем по таймеру. Решение насколько он будет "умным" зависит от базы данных и ее дизайна.
2. Попробуй рефрешнуть данные ADODataSet.Refresh или теми же Close и Open
ADODataSet.DisableControls;
try{ тут советую запомнить позицию в датасете по ключевому полю}
aKey := ADODataSet['KeyField'];
ADODataSet.Close;
ADODataSet.Open;
ADODataSet.Locate ('KeyField', aKey, []);
finally
ADODataSet.EnableControls;
end;
Здравствуйте, Sergey__, Вы писали:
S__>Здравствуйте, Danchik, Вы писали:
D>>Проще это сделать просто умным рефрешем по таймеру. S__>рефрешем по таймеру ?
Например: 1. Создаеш в базе служебную таблицу, в которой записываеш что изменилось и когда.
2. Программы изменяющие данные должны заполнять эту таблицу после каждого изменения. Это можна сделать и на уровне базы данных добавив соответствующие триггера (если они конечно поддерживаются)
3. Кидаеш на форму таймер, который запускает SQL для проверки этой таблицы (лучше в другом потоке). Выбирай данные, которые изменились после какого то времени.
4. Изменения есть — перечитываем форму
Здравствуйте, Danchik, Вы писали:
D>Здравствуйте, Sergey__, Вы писали:
S__>>Здравствуйте, Danchik, Вы писали:
D>>>Проще это сделать просто умным рефрешем по таймеру. S__>>рефрешем по таймеру ?
D>Например: D> D>1. Создаеш в базе служебную таблицу, в которой записываеш что изменилось и когда. D>2. Программы изменяющие данные должны заполнять эту таблицу после каждого изменения. Это можна сделать и на уровне базы данных добавив соответствующие триггера (если они конечно поддерживаются) D>3. Кидаеш на форму таймер, который запускает SQL для проверки этой таблицы (лучше в другом потоке). Выбирай данные, которые изменились после какого то времени. D>4. Изменения есть — перечитываем форму D>
и Вы когда нибудь реализовывали столь интересную схему ?
Здравствуйте, Sergey__, Вы писали:
S__>Здравствуйте, Danchik, Вы писали:
D>>Здравствуйте, Sergey__, Вы писали:
S__>>>Здравствуйте, Danchik, Вы писали:
D>>>>Проще это сделать просто умным рефрешем по таймеру. S__>>>рефрешем по таймеру ?
D>>Например: D>> D>>1. Создаеш в базе служебную таблицу, в которой записываеш что изменилось и когда. D>>2. Программы изменяющие данные должны заполнять эту таблицу после каждого изменения. Это можна сделать и на уровне базы данных добавив соответствующие триггера (если они конечно поддерживаются) D>>3. Кидаеш на форму таймер, который запускает SQL для проверки этой таблицы (лучше в другом потоке). Выбирай данные, которые изменились после какого то времени. D>>4. Изменения есть — перечитываем форму D>>
S__>и Вы когда нибудь реализовывали столь интересную схему ?
Да, если это поможет
Но все было намного сложнее. Записывалось какая таблица была изменена (точнее к каждой таблице была прикриплена своя служебная таблица).
Каждая таблица разбивалась на логические части по какому то полю(ях). Изменеие логической части порождало одну или две записи в служебной таблице (две — когда запись перепрыгивала из одной логической части в другую). Запись в служебные таблицы производилась триггерами.
Клиент определял какая таблица была изменена. Смотрел видима ли логическая часть таблицы на форме и перечитывал данные.
Дальше можна развивать идею как уменьшить траффик при перечитывании данных, и тд и тп...