使用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(二进制大对象)字段转换和导入/导出文件处理,但是发现没有一个适合我的工作:
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)初始转换过程如下:
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)。
我们将不胜感激任何帮助。
最好的问候, 帕特里克
答案 0 :(得分:0)
考虑到“只有第二个-或最后一个OLE对象控件受此锁影响”,我尝试了一个疯狂的想法,它几乎可以在不占用空间的情况下顺利地工作!
我在People表中添加了第三个OLE对象字段,名为Zdummy,并用单个char填充了该字段,并且在代码中的任何位置,都有对前pic OLE对象进行操作的代码片段,随后对侧面pic OLE对象进行了操作,我在为新的虚拟OLE对象添加了相同内容之后立即添加了。它以某种方式释放了侧面字段-谁知道!-我敢打赌:新的锁定发生了-谁知道哪个!-在新的虚拟字段上,除了让Access在我们上面玩之外,在任何地方都没有用过。>
因此,如果在不久的将来有人碰巧发现了这种晦涩的行为,我会非常高兴。否则,我会坚持这种解决方法。
以防万一有人在处理OLE对象字段上的图像时遇到类似的问题,请发表评论,我将上传我的第一篇文章中提到的4个主要功能的代码。
感谢所有致力于此工作的人。
最好的问候, 帕特里克