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

时间:2019-01-14 16:15:53

标签: locking ms-access-2010 blob image-store

使用2个OLE对象字段作为正面和侧面图片,仅对于第二个字段,我会收到错误3188(由同一台计算机上的另一个会话引起的锁定),即使过程与OLE对象字段或字符串指示符相同作为参数传递。

大家好!

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

我遇到一个非常奇怪的问题,即在带有Win 7和Win 10(x86和x64 OS)的计算机上使用.mdb格式的数据库在Access 2010中运行的HR应用程序。由于公司政策以及与其他应用程序的交互作用,我受到以下限制:

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

2)无法使用附件。

3)主表是People,并且有两个OLE对象字段,分别用于正面和侧面 脸部照片,既不能拆分成两个表,也不能建立另一个数据库,既不能存储照片,也不能存储对外部文件的引用。

出什么问题了?该数据库有12,000条记录,其中4.5K有图片,并且已达到2 Gb的限制大小。如今,它的容量为1.85 Gb,其中图片占据1.2 Gb,数据和所有其他资源为0.65 Gb。我正在尝试将1.2 Gb图片的大小减小到0.25 Gb,以便能够存储其余7.5 K记录的图片,达到1.4 GB的数据库。

众所周知,Access将.jpg文件以.bmp格式存储在OLE字段中,从而极大地增加了每个图片所占用的空间。照片的像素为180x240,每个文件的大小为10-15K,而每个bmp的大小为130K。

这些图片文件以两种形式进行编辑,以其他多种形式显示并在多个报告中打印。

解决问题的主要思路?使用获取/附加块以压缩的.jpg格式检索/存储照片。考虑到这一点,我通过了许多BLOB(二进制大对象)字段转换和导入/导出文件处理,但是发现没有一个适合我的工作:

似乎为我的目的服务的唯一功能是最后一个功能,因此我已结束编写四个功能:

  • OLEbmp_FILjpg:将.bmp格式的原始OLE字段导出为.jpg文件(通过编程控制MSPAINT.exe)

  • FILjpg_OLEjpg:将.jpg文件存储为.jpg格式的OLE字段

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

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

对该应用所做的更改是:

1)初始转换过程如下:

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

b。 FILjpg_OLEjpg将导出的.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。添加了两个命令按钮,分别是“修改图片”和“删除图片”。

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 OBJECT字段。

所描述的过程调用在任何地方都重复两次,一次是正面图片,另一个是侧面图片,两者一起,侧面图片代码紧随正面图片代码之后。 如我所写,它对正面的修改和删除均能正常工作,但对于侧面图片始终会崩溃,从而引发“错误3188-无法更新;无法更新;目前已被此计算机上的另一个会话锁定。”,甚至经过了独立测试,没有在数据库上打开或运行任何其他表单/查询/报告。

我尝试了以下解决方法:

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

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

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

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

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

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

最好的问候, 帕特里克

1 个答案:

答案 0 :(得分:0)

考虑到“只有第二个-或最后一个OLE对象控件受此锁影响”,我尝试了一个疯狂的想法,它几乎可以在不占用空间的情况下顺利地工作!

我在People表中添加了第三个OLE对象字段,名为Zdummy,并用单个char填充了该字段,并且在代码中的任何位置,都有对前pic OLE对象进行操作的代码片段,随后对侧面pic OLE对象进行了操作,我在为新的虚拟OLE对象添加了相同内容之后立即添加了。它以某种方式释放了侧面字段-谁知道!-我敢打赌:新的锁定发生了-谁知道哪个!-在新的虚拟字段上,除了让Access在我们上面玩之外,在任何地方都没有用过。

因此,如果在不久的将来有人碰巧发现了这种晦涩的行为,我会非常高兴。否则,我会坚持这种解决方法。

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

感谢所有致力于此工作的人。

最好的问候, 帕特里克