【发布时间】:2019-01-16 19:57:24
【问题描述】:
对正面和侧面图片使用 2 个 OLE 对象字段,我得到一个错误 3188(由同一台机器中的另一个会话引起的锁定)仅针对第二个字段,即使过程与 OLE 对象字段或字符串指示符相同作为参数传递。
大家好!
首先,我要为我的书面英语道歉,因为它不是我的母语,因为我是布宜诺斯艾利斯(阿根廷)的软件开发人员。
我遇到了一个非常奇怪的问题,即在 Access 2010 中运行的 HR 应用程序使用 .mdb 格式的数据库在装有 Win 7 和 Win 10 的 x86 和 x64 操作系统的机器上运行。由于公司政策和与其他应用程序的交互,我有以下限制:
1) 无法更改数据库类型,必须保留.mdb,无法切换到.accdb。
2) 不能使用附件。
3) 主表是 People,正面和侧面有两个 OLE 对象字段 人脸照片,既不能拆分成两个表,也不能建立另一个数据库,既不能存储照片,也不能存储对外部文件的引用。
有什么问题?数据库有 12 K 条记录,其中 4.5 K 有图片,并且达到了 2 Gb 的限制大小。现在它有 1.85 Gb,其中图片占据 1.2 Gb,数据和所有其他东西占据 0.65 Gb。我正在尝试将 1.2 Gb 图片的大小减小到 0.25 Gb,以便能够存储其余 7.5 K 记录的图片,达到 1.4 GB 的数据库。
众所周知,Access 在 OLE 字段中以 .bmp 格式存储 .jpg 文件,这极大地增加了每张图片使用的空间量。照片有 180x240 像素,10-15K .jpg 文件与 130K .bmp 文件。
这些图片文件以两种形式编辑,以许多其他形式显示并打印在多个报告中。
解决问题的主要思路是什么?使用 get/append chunk 以压缩的 .jpg 格式检索/存储照片。在这个想法中,我通过了许多 BLOB(二进制大对象)字段转换和导入/导出文件处理,但我发现没有一个适合我的工作:
来自 MSDN 的 2 个 BLOB 摘录
Stephen Leban 将 OLE 导出为 JPG
创新查询工具
Db-Pix 3.0
MSPaint.exe 调用 (https://www.tek-tips.com/viewthread.cfm?qid=392408)
似乎唯一符合我的目的的就是最后一个,所以我已经写完了四个函数:
OLEbmp_FILjpg:将.bmp格式的原始OLE字段导出为.jpg文件(编程控制MSPAINT.exe)
FILjpg_OLEjpg:将 .jpg 文件以 .jpg 格式存储到 OLE 字段中
OLEjpg_FILjpg:将新的 .jpg 格式的 OLE 文件导出为 .jpg 文件
FILjpg_CTLimg:用 .jpg 文件填充图像控件
对应用所做的更改是:
1) 初始转换过程如下:
一个。 OLEbmp_FILjpg 将旧的嵌入 .bmp 导出到外部 .jpg 文件
b. FILjpg_OLEjpg 将导出的 .jpg 文件存储到新的 OLE 对象字段中
2) 显示图片的表单是这样工作的:
一个。相关的对象框架被图像控件替换。
b.关于当前事件:
i. OLEjpg_FILjpg exports OLE embedded field to .jpg file.
ii. FILjpg_CTLimg fills the image control with .jpg file.
3) 显示图片的报告是这样工作的:
一个。相关的对象框架被图像控件替换。
b.在报告激活事件时(由于访问错误导致当前事件未触发):
i. OLEjpg_FILjpg exports OLE embedded field to .jpg file.
ii. FILjpg_CTLimg fills the image control with .jpg file.
4) 带有可编辑图片的表单是这样工作的:
一个。相关的对象框架被图像控件替换。
b.为“修改图片”和“删除图片”添加了两个命令按钮。
c。关于当前事件:
i. OLEjpg_FILjpg exports OLE embedded field to .jpg file.
ii. FILjpg_CTLimg fills the image control with .jpg file.
d。修改图片按钮下的过程:
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.
e。删除图片下的程序:
i. OLE object field value is set to null.
ii. Image control picture is cleared.
一切正常,除了 4) d) 和 e),但仅适用于第二个 OLE 对象字段。
所描述的程序调用在各处重复两次,一次用于正面图片,一次用于侧面图片,两者一起,侧面图片代码紧跟正面图片代码。 正如我所写,正面的修改和删除都可以正常工作,但侧面图片总是崩溃,引发“错误 3188 - 无法更新;目前被这台机器上的另一个会话锁定。”,甚至独立测试,没有其他表单/查询/报告在数据库上打开或运行。
我已经尝试过这种解决方法:
1) 删除了正面图片的控件和代码,但侧面图片仍然崩溃。
2) 删除了侧面图片的控件和代码,现在崩溃但正面图片。
3) 保留两个控件并在表格定义中反转它们(正面图片字段之前的侧面)并在第二个字段(现在为正面图片)崩溃。
锁似乎发生在最后一个 OLE 对象上,要么在表中定义(在我看来太奇怪了),要么在代码中使用或引用(我敢打赌),但我手动检查了每个对象实例化,它们'都结束了。实际上,用于处理正面和侧面图片的过程是相同的,通过传递 OLE 对象字段或字符串指示符作为参数来处理。那么为什么它适用于正面而不适用于侧面呢?
以防万一在每个过程中都使用返回代码进行错误处理,并且代码创建的对象(数据库、记录集、文件系统对象、控件、字段等)在退出前被关闭并销毁(设置为 Nothing)。
我们将不胜感激。
最好的问候, 帕特里克
【问题讨论】:
标签: locking ms-access-2010 blob image-store