将 Blob 图像导入 ms Access 报表时出现异常
Exception on importing Blob image into ms Access report
在 Access 2013 报告中,我通过链接 Table 连接到 Oracle 数据库视图。一个视图字段是 BLOB 类型,并保存以前存储在那里的图像。
在我的访问报告中,链接的 table 有一个“OLE 对象”类型的字段(名为 BILD_INHALT),它映射到 Oracle DB 中的 BLOB 字段。
在报告视图中,我创建了一个“图像”字段(名为 MST_Image)必须加载图像并按以下方式初始化:
If Len(RS![BILD_INHALT]) > 0 Then
Me.MST_Image.PictureData = RS![BILD_INHALT]
End If
在 运行 时,当我使用来自 Oracle 的内容初始化 MST_Image.PictureData 时出现以下异常。
我在互联网上查看有关此(非常古老的)主题的更多文档,但找不到有关此特定问题的任何信息。
错误有点不言自明:Microsoft Access 中的图像控件可以绑定到文件位置,也可以设置为 .dib
图像(device independent bitmap format,其中之一更模糊的图像格式)。
不过,解决这个问题并不容易。
您可以通过多种方式解决该限制:
- 使用支持多种图像格式的 ActiveX 控件(有多种待查找)
- 将图像保存到磁盘的临时文件夹中,并将图像控件源设置到它的位置
- 使用网络浏览器控件,并使用 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"
以将其初始化为空白页
在 Access 2013 报告中,我通过链接 Table 连接到 Oracle 数据库视图。一个视图字段是 BLOB 类型,并保存以前存储在那里的图像。
在我的访问报告中,链接的 table 有一个“OLE 对象”类型的字段(名为 BILD_INHALT),它映射到 Oracle DB 中的 BLOB 字段。
在报告视图中,我创建了一个“图像”字段(名为 MST_Image)必须加载图像并按以下方式初始化:
If Len(RS![BILD_INHALT]) > 0 Then
Me.MST_Image.PictureData = RS![BILD_INHALT]
End If
在 运行 时,当我使用来自 Oracle 的内容初始化 MST_Image.PictureData 时出现以下异常。
我在互联网上查看有关此(非常古老的)主题的更多文档,但找不到有关此特定问题的任何信息。
错误有点不言自明:Microsoft Access 中的图像控件可以绑定到文件位置,也可以设置为 .dib
图像(device independent bitmap format,其中之一更模糊的图像格式)。
不过,解决这个问题并不容易。
您可以通过多种方式解决该限制:
- 使用支持多种图像格式的 ActiveX 控件(有多种待查找)
- 将图像保存到磁盘的临时文件夹中,并将图像控件源设置到它的位置
- 使用网络浏览器控件,并使用 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"
以将其初始化为空白页