Используя 2 поля объекта OLE для изображения передней и боковой поверхности, я получаю ошибку 3188 (блокировка вызвана другим сеансом на том же компьютере) только для 2-го поля, даже процедуры совпадают с полем объекта OLE или строковым индикатором. передается в качестве параметров.
Привет, все!
Прежде всего я хочу извиниться за мой письменный английский, поскольку он не является моим родным языком, так как я являюсь разработчиком программного обеспечения в Буэнос-Айресе (Аргентина).
У меня возникла очень странная проблема с приложением HR, работающим в Access 2010, использующим базу данных формата .mdb на компьютерах с Win 7 и Win 10 как на x86, так и на x64. Из-за корпоративных политик и взаимодействия с другими приложениями у меня есть следующие ограничения:
1) Невозможно изменить тип БД, должен хранить .mdb и не может переключиться на .accdb.
2) Невозможно использовать вложенные файлы.
3) Основная таблица - People и имеет два поля OLE-объекта: передняя и боковая.
и не может разделить две таблицы и создать другую БД для хранения фотографий и хранения ссылок на внешние файлы.
В чем проблема? В БД записано 12 Кбайт, где 4,5 Кбайт содержит снимки и достигает предельного размера 2 Гб. В настоящее время он имеет 1,85 ГБ, где фотографии занимают 1,2 ГБ, а данные и все остальное - 0,65 ГБ. Я пытаюсь уменьшить размер фотографий 1,2 ГБ до 0,25 ГБ, чтобы иметь возможность хранить фотографии для остальных записей 7,5 КБ, достигая БД 1,4 ГБ.
Как известно, Access хранит файлы .jpg в формате .bmp в полях OLE, значительно увеличивая объем пространства, используемого для каждой картинки. Фотографии имеют размер 180x240 пикселей, размер файла 10-15K .jpg против 130Kbb.
Эти файлы изображений редактируются в двух формах, отображаются во многих других и печатаются в нескольких отчетах.
Основная идея для решения проблемы? Используйте блок get / append для извлечения / хранения фотографий в сжатом формате .jpg. В этой мысли я прошел через множество преобразований полей BLOB (большой двоичный объект) и обработку файлов импорта / экспорта, но не нашел ни одного подходящего для моей работы:
Единственный, который, казалось, служил моим целям, был этот последний, поэтому я закончил писать четыре функции:
OLEbmp_FILjpg: экспортировать исходное поле OLE в формате .bmp в файл .jpg (программно управляя MSPAINT.exe)
FILjpg_OLEjpg: сохранить файл .jpg в поле OLE в формате .jpg
OLEjpg_FILjpg: экспортировать новый файл OLE в формате .jpg в файл .jpg
FILjpg_CTLimg: заполняет элемент управления изображением с помощью файла .jpg
Изменения, внесенные в приложение:
1) Начальный процесс преобразования работает следующим образом:
а. OLEbmp_FILjpg экспортирует старый встроенный файл .bmp во внешний файл .jpg
б. FILjpg_OLEjpg сохраняет экспортированный файл .jpg в поле нового объекта OLE
2) Формы, отображающие картинки, работают следующим образом:
а. Рамки зависимых объектов заменяются элементами управления изображением.
б. На текущее событие:
i. OLEjpg_FILjpg exports OLE embedded field to .jpg file.
ii. FILjpg_CTLimg fills the image control with .jpg file.
3) Отчеты с отображением картинки работают следующим образом:
а. Рамки зависимых объектов заменяются элементами управления изображением.
б. Событие активации отчета (поскольку текущее событие не вызвано из-за ошибки доступа):
i. OLEjpg_FILjpg exports OLE embedded field to .jpg file.
ii. FILjpg_CTLimg fills the image control with .jpg file.
4) Формы с редактируемыми фотографиями работают так:
а. Рамки зависимых объектов заменяются элементами управления изображением.
б. Добавлены две командные кнопки для «Изменить изображение» и «Удалить изображение».
с. На текущее событие:
i. OLEjpg_FILjpg exports OLE embedded field to .jpg file.
ii. FILjpg_CTLimg fills the image control with .jpg file.
д. Процедура под кнопкой Modify Pic:
i. New pic is selected from File open dialog.
ii. FILjpg_OLEjpg stores .jpg data in OLE object field.
iii. FILjpg_CTLimg displays new pic in form.
е. Процедура в разделе Удалить рисунок:
i. OLE object field value is set to null.
ii. Image control picture is cleared.
все работаетхорошо, за исключением 4) d) и e), но ТОЛЬКО ДЛЯ 2-го ПОЛЕВОГО ОБЪЕКТА.
Описанные вызовы процедур повторяются повсюду дважды, один раз для переднего изображения и снова для бокового изображения, оба вместе, код изображения бокового лица сразу после кода изображения переднего лица.
Как я уже писал, он отлично работает как для модификации, так и для удаления на лицевой стороне, но всегда вылетает для картинки на боковой поверхности, вызывая «Ошибка 3188 - Не удалось обновить; в настоящее время заблокирован другим сеансом на этом компьютере. ”, даже протестирован автономно и без других форм / запросов / отчетов, открытых или работающих в БД.
Я пробовал эти обходные пути:
1) Удалены элементы управления и код для передней картинки и все еще происходит сбой для боковой картинки.
2) Удалены элементы управления и код для картинки на боковой поверхности и теперь вылетает, но для картинки на передней панели.
3) Сохраняет оба элемента управления и инвертирует их в определении таблицы (боковая грань перед полем рис.) И вылетает для 2-го поля, теперь перед рис.
Кажется, что блокировка произошла с последним объектом OLE, определенным в таблице (слишком странно, на мой взгляд), или использованным или на который есть ссылки в коде (я бы поставил на это), но я проверил вручную каждый экземпляр объекта, и они все закончилось правильно. Действительно, процедуры, используемые для работы с передней и боковой фотографиями, одинаковы, и обрабатываются путем передачи либо поля объекта OLE, либо строкового индикатора в качестве параметра. Так почему же он работает спереди, а не на боковой поверхности?
На всякий случай обработка ошибок с помощью кода возврата реализована в каждой процедуре, а объекты, созданные в коде (базы данных, наборы записей, объекты файловой системы, элементы управления, поля и т. Д.), Закрываются и уничтожаются (задаются как «Ничего») перед выходом.
Любая помощь будет высоко оценена.
С уважением,
Patrick