Консультация № 187795
20.03.2014, 18:00
104.94 руб.
0 5 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Есть приложение, база данных. При добавлении данных проблем не замечено, а вот при удалении данных, после 3-4 удалений появляется ошибка "Не достаточно памяти". В диспетчере задач видно что при каждом удалении растет объем занятой памяти приложением. В чем может быть проблема? После закрытия приложения память освобождается. Использую БД Microsoft Access, подключение через ADOConnection, ADOTable, ну и для навигации использую DBNavigator1.

Обсуждение

Неизвестный
20.03.2014, 18:23
общий
вполне возможно, что все изменения хранятся в кэше. попробуйте сначала установить свойство Local Share в true.
Неизвестный
21.03.2014, 17:45
общий
еще вариант. в ADOTable есть свойство BacthUpdate. его нужно установить в False. тогда после каждого изменения/удаления записи результат будет сразу записываться в таблицу и освобождаться память.
Неизвестный
24.03.2014, 15:50
общий
Адресаты:
автор! где пропал?
Неизвестный
25.03.2014, 16:13
общий
Адресаты:
если ничего пока не помогло. желательно выложить в этот форум кусок кода подключения к базе и открытии таблиц. добавлять сообщения можно внизу мини-форума в специальном поле и нажав "отправить".

Неизвестный
27.03.2014, 22:45
общий
это ответ
Здравствуйте, Владимир!

По Вашим ответам в переписке удалось выяснить, что отображение таблицы производится на главной форме, а для изменения/удаления данных вызывается вторичная форма с выводом этой же таблицы. При этом перед вызовом формы редактирования на основной форме командой ADOTable.Edit список записей переводится в режим редактирования. В то же время во вторичной форме при каких-либо изменениях компонент DBNavigator автоматически вносит изменения в таблицу. Но, т.к. таблица в основной форме уже подготовлена для изменений, то фактически получается многопользовательский режим в одном приложении и все изменения не могут быть внесены до того, пока не закроются все открытые для изменения таблицы. При добавлении новых записей это не так страшно - в первичной форме их еще нет, но при удалении/редактировании оказывается, что данные записи уже заблокированы, и вся работа не может быть сохранена на диске. Наборы данных ADO используют на клиентской стороне локальный кэш для хранения данных и сделанных изменений. В этом режиме все сделанные изменения не передаются немедленно источнику данных, а накапливаются в локальном кэше. В момент выхода из формы редактирования и снятия в основной форме режима Edit производится обновление таблицы в базе. При этом все данные из оперативной памяти перегоняются на диск и в этот момент производится очистка временно сохраненных данных из оперативной памяти и ее освобождение. В том случае, если производится большой объем изменений во вторичной форме, то все это хранится в оперативной памяти, и в какой-то момент ее может не хватить и появится такая ошибка.
Решением проблемы послужит отказ от перевода таблицы в режим Edit перед открытием формы редактирования, т.к. в DBNavigator уже предусмотрен переход в режим изменений записей и автоматическое сохранение введенных данных при различных манипуляциях пользователя с введенными данными либо это нужно программно предусмотреть при закрытии формы редактирования и возврата на основную форму.

Хотелось бы еще написать вот о чем. В данном случае используется монопольный ( однопользовательский ) режим доступа к данным. Но в случае, когда на разных компьютерах будет запущено несколько таких приложений и некоторые пользователи будут находится на форме редактирования для внесения изменений в таблицу, может возникнуть такая же ситуация. Т.к. данные вносятся в базу только при выходе из формы, то на всех компьютерах они будут храниться в оперативной памяти.
В этом случае решением может быть использование SQL запросов на добавление/изменение/удаление записей. Таблицы используются только для отображения. При необходимости изменения/добавления открывается дополнительная форма с текстовыми полями, соответствующими данным в таблице. После ввода пользователем данных производится проверка ввода и запускается SQL-запрос Insert, Update или Delete соответственно. Т.к. выполнение запроса происходит значительно быстрее, чем блокировка записи перед редактированием, ожидание ввода пользователя и подтверждение вводимых изменений, то таблица или соответствующая запись блокируется на незначительное время, что позволит избежать трат оперативной памяти на хранение изменений таблицы. Но при этом желательно отслеживать факт изменения таблиц другими пользователями и своевременно обновлять содержимое таблиц.

С уважением.
Форма ответа