使用OLE对象字段存储.jpg图像时出现访问错误3188



使用正面和侧面图片的2个OLE对象字段,我只在第二个字段得到错误3188(由同一机器中的另一个会话引起的锁定),即使过程与OLE对象字段相同,也会将字符串指示符作为参数传递。

大家好!

首先,我想为我的书面英语道歉,因为它不是我的母语,因为我是布宜诺斯艾利斯(阿根廷)的软件开发人员。

我面临着一个非常奇怪的问题,一个在Access 2010中运行的人力资源应用程序在带有Win 7&赢得10 x86和x64操作系统。由于公司政策和与其他应用程序的交互,我有以下限制:

1) 无法更改数据库类型,必须保留.mdb并且无法切换到.accdb.

2) 无法使用附加文件。

3) 主表是People,前面和侧面有两个OLE对象字段既不能拆分为两个表,也不能构建另一个数据库来存储照片,也不能只存储对外部文件的引用。

问题出在哪里?DB有12K的记录,其中4.5K有图片,并且已达到2Gb的限制大小。如今,它拥有1.85 Gb,其中pics占用1.2 Gb,而data&所有其他东西0.65Gb。我正试图将1.2 Gb的pics大小减少到0.25 Gb,以便能够存储其余7.5 K记录的pics,达到1.4 Gb的DB。

众所周知,Access将.jpg文件以.bmp格式存储在OLE字段中,极大地增加了每张图片的空间量。照片有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_OLE_jpg:以.jpg格式将.jpg文件存储到OLE字段中

  • OLEjpg_FILjpg:将.jpg格式的新OLE文件导出为.jpg文件

  • FILjpg_CTLimg:用.jpg文件填充图像控件

对应用程序所做的更改包括:

1) 初始转换过程如下所示:

a。OLEbmp_FILjpg将旧的嵌入.bmp导出到外部.jpg文件

b。FILjpg_OLE_jpg将导出的.jpg文件存储到新的OLE对象字段中

2) 显示图片的表单是这样工作的:

a。从属对象帧由图像控件替换。

b。当前事件:

i.  OLEjpg_FILjpg exports OLE embedded field to .jpg file.
ii. FILjpg_CTLimg fills the image control with .jpg file.

3) 显示图片的报告如下所示:

a。从属对象帧由图像控件替换。

b。报告激活事件(由于Access错误导致当前事件未触发):

i.  OLEjpg_FILjpg exports OLE embedded field to .jpg file.
ii. FILjpg_CTLimg fills the image control with .jpg file.

4) 具有可编辑图片的表单工作方式如下:

a。从属对象帧由图像控件替换。

b。增加了"修改图片"one_answers"删除图片"两个命令按钮。

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)外,一切正常,但仅适用于第2个OLE对象字段。

所描述的过程调用在任何地方重复两次,一次用于正面图片,另一次用于侧面图片,两者都在一起,侧面图片代码紧跟在正面图片代码之后。正如我所写的,它对正面的修改和删除都很好,但对侧面的图片总是崩溃,引发"错误3188-无法更新;当前被这台机器上的另一个会话锁定。",甚至在独立测试的情况下进行了测试,在DB上没有打开或运行其他表单/查询/报告。

我尝试过这种变通方法:

1) 删除了正面图片的控制和代码,侧面图片仍然崩溃。

2) 删除了侧面图片的控制和代码,现在崩溃了,但正面图片。

3) 保留两个控件并在表定义中反转它们(正面图片字段之前的侧面),然后在第二个字段崩溃,现在是正面图片。

锁定似乎发生在表中定义的(在我看来太奇怪了)或在代码中使用或引用的最后一个OLE对象上(我敢打赌),但我手动检查了每个对象实例化,它们都正确结束了。事实上,用于处理正面和侧面图片的过程是相同的,通过传递OLE对象字段或字符串指示符作为参数来处理。那么,为什么它适用于正面而不适用于侧面呢?

万一在每个过程中都实现了使用返回代码的错误处理,并且代码创建的对象(数据库、记录集、文件系统对象、控件、字段等)在退出之前都会关闭并销毁(设置为Nothing)。

如有任何帮助,我们将不胜感激。

谨致问候,Patrick

想到"只有第二个或最后一个OLE对象控件受到此锁的影响",我尝试了一个疯狂的想法,它几乎不需要空间成本就能顺利工作!

我在People表中添加了一个名为Zdummy的第三个OLE对象字段,并用一个字符填充它,在代码中的任何地方,只要有对正面图片OLE对象进行操作的代码片段,然后是对侧面图片OLE对象的操作片段,我就会立即为新的伪OLE对象添加相同的内容。不知怎么的,它解放了侧面场-谁知道怎么回事!-我打赌:一把新锁发生了——谁知道是哪把!——在新的虚拟场上,除了让Access在我们身上播放外,它在任何地方都没有使用。

所以,如果在不久的将来,有人碰巧揭露了这种晦涩的行为,我会非常高兴。否则我会坚持这个变通办法。

万一有人在处理OLE对象字段上的图像时遇到类似的问题,请发表评论,我将上传我第一篇文章中提到的4个主要函数的代码。

感谢所有花时间阅读本文的人。

谨致问候,Patrick

最新更新