将Blob图像导入ms访问报告

时间:2017-10-17 15:14:43

标签: vb.net ms-access oracle11g report

在Access 2013报告中,我通过链接表连接到Oracle DB View。一个视图字段的类型为BLOB,并保存先前存储在那里的图像。

在我的Access报告中,链接表有一个类型为" OLE Object"的字段(名为BILD_INHALT)。映射到Oracle DB中的BLOB字段。

在报告视图中,我创建了一个" Image" field(名为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

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

1 个答案:

答案 0 :(得分:2)

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

然而,解决它并不容易。

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

  1. 使用支持多种图像格式的ActiveX控件(有多个图像格式)
  2. 将图像保存到临时文件夹中的磁盘,并将图像控制源设置为其位置
  3. 使用网络浏览器控件,并使用HTML <img />标记显示您的图片,使用embedded BASE64 image
  4. 以下是方法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
    

    然后,我们可以使用Web浏览器控件,并将带有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是您的webbrowser控件的名称,image/jpg是您的图片类型,MyOLEObject是您的OLE对象。

    提示:

    • 不要使用WebBrowser ActiveX控件,而是使用Access附带的控件。否则,您将获得一个过时的Internet Explorer版本,其中包含无法删除的3D边框。
    • 将网络浏览器控件的控件来源设置为="about:blank",将其初始化为空白页