Итак, в "Шаг 7 - Клиент ACCESS и блокировки". Мы увидели, что блокировка появляется, если считывается большое количество записей. А достаточно пройти вперед и назад по записям, как тут же она пропадает. Задача которую я себе поставил выяснить кто виноват в такой блокировке. Сам Access как таковой или нет. И тут же запутался с документацией и книгами. Поэтому, если окажется что я ошибся, Вы догадываетесь кто виноват.
Первое что я вычитал - Независимо от того как установлена блокировка при работе с данными, которые поступают из связанных БД ODBC, режим блокировки MS ACCESS игнорируется. (Ресурсы Microsoft Office 97 стр. 656).
Вроде как ACCESS не виноват. Тут поняв это я сделал тестировочную программу используя ODBC. Я приложу ее код. Подробнее о программировании ODBC читайте соответствующий раздел.
....... CDatabase cdbMyDB; cdbMyDB.OpenEx("DSN=test"); if (cdbMyDB.IsOpen()) { cout << "Ok Connect" << endl; CRecordset cr(&cdbMyDB); cr.Open(CRecordset::forwardOnly,"{call TEMPS}",CRecordset::readOnly); if (cr.IsOpen()) { cout << "Ok Open" << endl; int i; cin << i; cr.Close(); } } ........
При таком коде будет блокировка.
Но опять же только в том случае, если мы открываем таблицу в режиме CRecordset::forwardOnly. В режиме с форвардной прокруткой. Достаточно изменить на CRecordset::dynaset. Блокировки больше не будет. Получается все-таки виноват ACCESS, так как он отрывает запрос в режиме forwardOnly. По крайней мере по умолчанию.