【问题标题】:Access error 3188 using OLE object fields for storing .jpg images使用 OLE 对象字段存储 .jpg 图像访问错误 3188
【发布时间】: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(二进制大对象)字段转换和导入/导出文件处理,但我发现没有一个适合我的工作:

似乎唯一符合我的目的的就是最后一个,所以我已经写完了四个函数:

  • 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


    【解决方案1】:

    想到“只有第二个或最后一个 OLE 对象控制受此锁影响”,我尝试了一个疯狂的想法,它运行顺利,几乎没有空间成本!

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

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

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

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

    最好的问候, 帕特里克

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-20
      • 2019-10-02
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      相关资源
      最近更新 更多