2017-10-17 1 views
2

In einem Access 2013-Bericht stelle ich über eine verknüpfte Tabelle eine Verbindung zu einer Oracle DB-Ansicht her. Ein View-Feld ist vom Typ BLOB und enthält Bilder, die zuvor dort gespeichert wurden.Ausnahme beim Importieren von Blob-Bildern in ms Access-Bericht

In meinem Zugriffsbericht hat die verknüpfte Tabelle ein Feld (mit dem Namen BILD_INHALT) vom Typ "OLE-Objekt", das dem BLOB-Feld in Oracle DB zugeordnet ist.

In der Berichtsansicht Ich habe ein „Bild“ Feld (mit dem Namen MST_Image) hat das Bild zu laden und es wird auf die folgende Art und Weise initialisiert:

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

Zur Laufzeit ich die folgenden Ausnahme erhalten, wenn Ich initialisiere MST_Image.PictureData mit dem Inhalt von Oracle.

enter image description here

prüfe ich im Internet über weitere Unterlagen zu diesem (sehr alt) Thema, aber ich kann nichts über dieses spezifische Problem finden.

Antwort

2

Der Fehler ist etwas selbsterklärend: ein Image-Steuerelement in Microsoft Access kann entweder an einen Speicherort gebunden sein oder kann auf ein .dib Bild (device independent bitmap format, eines der obskuren Bildformate) festgelegt werden.

Um es zu arbeiten, ist jedoch nicht so einfach.

Sie um diese Einschränkung auf verschiedene Weise arbeiten können:

  1. ein ActiveX-Steuerelement verwenden, die (sind dort zu finden mehrere sein) mehrere Bildformate unterstützt
  2. Speichern Sie das Bild auf der Festplatte in einem temporären Ordner, und stellen Sie die Bilder Steuerquelle seiner Lage
  3. einen Web-Browser-Steuerung verwenden, und verwenden Sie den HTML-Tag <img /> Ihr Bild anzuzeigen, unter Verwendung eines embedded BASE64 image

Hier ist der Beispielcode für Ansatz 3:

Zuerst müssen wir in dem OLE-Objekt zu BASE64 enthielt den Binärcode umwandeln können:

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 

Dann können wir ein, verwenden Web-Browser-Steuerelement, und legen sie eine Web-Seite mit dem BASE64-kodierten Bild hinein:

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 

Wo MyWebbrowserControl der Name Ihrer Web-Browser Kontrolle, image/jpg ist Ihr Bild t ype und MyOLEObject ist Ihr OLE-Objekt. Tipps

:

  • Sie nicht das WebBrowser ActiveX-Steuerelement verwenden, sondern verwenden Sie die eine, die mit Access kommt. Andernfalls erhalten Sie eine veraltete Version von Internet Explorer mit einem 3D-Rahmen, der nicht entfernt werden kann.
  • die Steuerquelle für die Steuer Web-Browser einstellen zu ="about:blank" es als eine leere Seite
+0

Vielen Dank Erik für die Antwort zu initialisieren. Der Access-Bericht wurde von einem meiner Kollegen in VB.net geschrieben und die Oracle DB-Quelle (wo die Bilder als BLOBS gespeichert werden) unterliegt der Kontrolle des Kunden. Da ich nur begrenzte Zeit habe, um die Probleme zu lösen, werde ich mit Ihrem 2. Vorschlag versuchen. – Francesco

+0

@Francesco Wie gesagt, ich habe Beispiel VBA-Code für die dritte Lösung, und während es nicht kurz sein kann, sollte es wenig oder gar keine Änderung erfordern. Die zweite Lösung ist jedoch auch in Ordnung. Ich empfehle, [Chip Pearsons mit temporären Ordnern und Dateien in VBA arbeiten] (http://www.cpearson.com/excel/WorkingWithTempFilesAndFolders.htm), wenn Sie dafür gehen. –

+0

Ich wäre dankbar, wenn es möglich wäre, Ihren VBA-Beispielcode zu sehen, haben Sie ihn in einem Blog veröffentlicht oder können Sie mir sagen, wie ich ihn bekomme? Nochmals vielen Dank – Francesco

Verwandte Themen