Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Exceção na importação de imagem Blob para o relatório do MS Access


O erro é um pouco autoexplicativo:um controle de imagem no Microsoft Access pode ser vinculado a um local de arquivo ou pode ser definido como um .dib imagem (bitmap independente do dispositivo formato , um dos formatos de imagem mais obscuros).

Trabalhar em torno disso, no entanto, não é tão fácil.

Você pode contornar essa limitação de várias maneiras:
  1. Use um controle ActiveX que suporte vários formatos de imagem (há vários a serem encontrados)
  2. Salve a imagem em disco em uma pasta temporária e defina a fonte de controle de imagens para seu local
  3. Use um controle de navegador da Web e use o HTML <img /> para exibir sua imagem, usando uma imagem BASE64 incorporada

Aqui está o código de exemplo para a abordagem 3:

Primeiro, precisamos ser capazes de converter o código binário contido no objeto OLE para 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

Em seguida, podemos usar um controle de navegador da Web e inserir uma página da Web com a imagem codificada em 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

Onde MyWebbrowserControl é o nome do seu controle do navegador, image/jpg é o seu tipo de imagem e MyOLEObject é o seu objeto OLE.

Pontas:
  • Não use o controle ActiveX WebBrowser, mas use o que vem com o Access. Caso contrário, você receberá uma versão desatualizada do Internet Explorer com uma borda 3D que não pode ser removida.
  • Defina a fonte de controle para o controle do navegador da Web como ="about:blank" para inicializá-lo como uma página em branco