vb.net - 将 Blob 图像导入 ms Access 报表时出现异常

标签 vb.net ms-access oracle11g report

在 Access 2013 报告中,我通过链接表连接到 Oracle 数据库 View 。一个 View 字段是 BLOB 类型并保存以前存储在那里的图像。

在我的 Access 报告中,链接表有一个“OLE 对象”类型的字段(名为 BILD_INHALT),它映射到 Oracle 数据库中的 BLOB 字段。

在报告 View 中,我创建了一个“图像”字段(名为 MST_Image),它必须加载图像并按以下方式初始化:

If Len(RS![BILD_INHALT]) > 0 Then
   Me.MST_Image.PictureData = RS![BILD_INHALT]
End If

在运行时,当我使用来自 Oracle 的内容初始化 MST_Image.PictureData 时,出现以下异常。

enter image description here

我在互联网上查看有关此(非常古老的)主题的更多文档,但找不到有关此特定问题的任何信息。

最佳答案

该错误有点不言自明:Microsoft Access 中的图像控件可以绑定(bind)到文件位置,也可以设置为 .dib图像( device independent bitmap format ,一种更晦涩的图像格式)。

不过,解决这个问题并不是那么容易。

您可以通过多种方式解决该限制:

  1. 使用支持多种图像格式的 ActiveX 控件(可以找到多种格式)
  2. 将图像保存到磁盘的临时文件夹中,并将图像控制源设置到它的位置
  3. 使用网络浏览器控件,并使用 HTML <img />使用 embedded BASE64 image 标记来显示您的图像

这是方法 3 的示例代码:

首先,我们需要能够将 OLE 对象中包含的二进制代码转换为 BASE64:

Public Function ToBase64(Bytes As Variant) As String
    Dim XMLElement As Object
    Set XMLElement = CreateObject("Msxml2.DOMDocument.6.0").createElement("tmp")
    XMLElement.DataType = "bin.base64"
    XMLElement.nodeTypedValue = Bytes
    ToBase64 = Replace(XMLElement.Text, vbLf, "")
End Function

然后,我们可以使用网络浏览器控件,并在其中插入一个带有 BASE64 编码图像的网页:

Public Sub InsertImageInControl()
    Dim wb As Object
    Set wb = MyWebbrowserControl.Object
    With wb
        .Navigate2 "about:blank"
        Do Until .ReadyState = 4 '=READYSTATE_COMPLETE
            'This is a somewhat inefficient way to wait, but loading a blank page should only take a couple of milliseconds
            DoEvents
        Loop
        .Document.Open
        .Document.Write "<!DOCTYPE html><HTML><HEAD><TITLE>A</TITLE></HEAD><BODY scroll=""no"" style=""margin: 0px; padding: 0px;"">"
        .Document.Write "<img alt="""" style=""width:100%; margin: 0px; padding: 0px;"" src=""data:image/jpg;base64,"
        .Document.Write ToBase64(MyOLEObject.Value)
        .Document.Write """ />"
        .Document.Write "</BODY></HTML>"
        .Document.Close
    End With
End Sub

在哪里MyWebbrowserControl是您的网络浏览器控件的名称,image/jpg是你的图片类型,MyOLEObject是您的 OLE 对象。

提示:

  • 不要使用 WebBrowser ActiveX 控件,而是使用 Access 附带的控件。否则,您将获得带有无法移除的 3d 边框的过时版本的 Internet Explorer。
  • 将 Web 浏览器控件的控制源设置为 ="about:blank"将其初始化为空白页

关于vb.net - 将 Blob 图像导入 ms Access 报表时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46793548/

相关文章:

sql - 防止某些行在 Oracle 中被删除

vb.net - 在通过 vb.net 导出到 Excel(从 MS Access)期间将 TRUE FALSE 转换为 1 和 0

asp.net - 获取自动调整大小的控件的大小?

ms-access - Access - VB 中行分隔 "& _"和 "_"之间的区别

java - UcanAccess 和 Java 出现 BIG_INT 错误

sql - 从表中删除所有

plsql - 执行一个oracle包函数

sql - 使用两列透视数据

vb.net - 如何从结果集中搜索结果集

c# - vb.NET 到 C# 的转换错误 : Cannot implicitly convert type 'object' to 'MyCustomObject' An explicit conversion exists