Получите доступ к ошибке 3188, используя поля объекта OLE для хранения изображений .jpg - PullRequest
0 голосов
/ 14 января 2019

Используя 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

1 Ответ

0 голосов
/ 16 января 2019

Думая о том, что «блокировка только 2-го или последнего-OLE объекта затрагивается этой блокировкой», я попробовал сумасшедшую идею, и она работает плавно, практически без затрат на пространство!

Я добавил 3-е поле OLE-объекта в таблицу People с именем Zdummy, заполнил его одним символом, и везде, где в коде были фрагменты, которые работают с OLE-объектом спереди pic, затем то же самое для OLE-объекта pic на боковой поверхности. Я сразу же добавил то же самое для нового фиктивного объекта OLE. Каким-то образом это освободило поле боковой грани - кто знает как! - и я держу пари на это: на новом фиктивном поле происходит новая блокировка - кто знает, какая! - она ​​нигде не используется, кроме как для доступа Access к нам.

Так что, если в ближайшем будущем кто-то осветит это неясное поведение, я был бы очень счастлив. В противном случае я буду придерживаться этого обходного пути.

На всякий случай, если у кого-то возникнут похожие проблемы с обработкой изображений в полях объекта OLE, пожалуйста, оставьте комментарий, и я загрузлю код для 4 основных функций, упомянутых в моем первом сообщении.

Спасибо всем, кто посвятил немного своего времени чтению этого.

С уважением, Patrick

...