Есть 2 написанные на VC++ проги, которые работают с одной аксессовской базой через ADO (в ней общие настройки хранятся).
Одна прога добавляет пару записей в каждую из таблиц базы, другая — пытается их прочитать через несколько секунд. Добавление и выборка идет с использованием CADORecordSet, все операции происходят с открытием/закрытием транзакций из класса CADODatabase. Вторая прога открывает базу один раз при своем старте.
Проблема в том, что когда открываешь таблицу через рекордсет второй прогой, изменения в нем не отображаются (т.е. он пустой! проверял через IsBOF и IsEOF). Запрос в рекордсете на чтение — обычный, типа SELECT * FROM T_OPTIONS WHERE FileName = '111.txt' AND ParamA = 2;
Хотя если дебажить — то все занесенные записи от первой проги там уже присутствуют!
Они там также будут, если, например, добавить и сразу удалить какую-нибудь тестовую строку.
Но оченнь не хочеца вставлять такой костыль в код...
Что нужно сделать для обновления таблицы каждый раз при чтении ее из второй проги?
Объясните, плиз.
Здравствуйте, 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 в таблицы базы. Отлично работает в разных процессах, и все обновления теперь присутствуют.