Как читать обновления таблиц в Access из разных процессов?
От: Bohemien  
Дата: 19.09.07 11:21
Оценка:
Есть 2 написанные на VC++ проги, которые работают с одной аксессовской базой через ADO (в ней общие настройки хранятся).
Одна прога добавляет пару записей в каждую из таблиц базы, другая — пытается их прочитать через несколько секунд. Добавление и выборка идет с использованием CADORecordSet, все операции происходят с открытием/закрытием транзакций из класса CADODatabase. Вторая прога открывает базу один раз при своем старте.

Проблема в том, что когда открываешь таблицу через рекордсет второй прогой, изменения в нем не отображаются (т.е. он пустой! проверял через IsBOF и IsEOF). Запрос в рекордсете на чтение — обычный, типа SELECT * FROM T_OPTIONS WHERE FileName = '111.txt' AND ParamA = 2;

Хотя если дебажить — то все занесенные записи от первой проги там уже присутствуют!
Они там также будут, если, например, добавить и сразу удалить какую-нибудь тестовую строку.
Но оченнь не хочеца вставлять такой костыль в код...

Что нужно сделать для обновления таблицы каждый раз при чтении ее из второй проги?
Объясните, плиз.
Re: Как читать обновления таблиц в Access из разных процессо
От: Аноним  
Дата: 20.09.07 07:07
Оценка:
Здравствуйте, Bohemien, Вы писали:

B>Объясните, плиз.


Объясни себе сам...

Библиотека %Program Files%\Common Files\System\Ado\msjro.dll действительно экспортирует интерфейс IJetEngine, из которого можно спокойно вызывать RefreshCache() примерно так:
{
// ...
IJetEnginePtr jet(__uuidof(JetEngine));
HRESULT hr = jet->RefreshCache(pConnection);
// ...
}
где pConnection можно получить через CADODatabase::GetActiveConnection().

Вынести это в отдельный метод класса и вызывать при открытии рекордсета каждый раз, когда нужно сбросить кэш OLEDB Jet Engine в таблицы базы. Отлично работает в разных процессах, и все обновления теперь присутствуют.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.