Es gibt immer mal wieder eine Gelegenheit, Bilder in Datenbanken zu speichern, anzuzeigen oder von dort auf die Festplatte zu speichern. Die meisten Wege führen dabei über das Zwischenspeichern im Dateisystem, manch eine Anwendung belässt die Bilddateien auch direkt im entsprechenden Ordner. Mit einem Image-Steuerelement und einer Tabelle mit einem OLE-Feld behält man alles an einem Ort – nämlich in der Datenbank.
Als Beispiel für diesen Artikel dient die Bücherverwaltung aus dem gleichnamigen Beitrag in dieser Ausgabe von Access im Unternehmen (Shortlink 633). Diese speichert Bilder direkt in der Tabelle tblBuecher zusammen mit den anderen Buchinformationen und zeigt die Bilder im Formular frmBuch zum jeweils passenden Exemplar an (siehe Bild 1). Dabei bezieht sie die Bilddateien aus verschiedenen Quellen: Wenn Sie die Bücher manuell eintragen, können Sie selbst eingescannte oder anderweitig verfügbare Buchcover in der Datenbank speichern, indem Sie einfach auf die Bild hinzufügen-Schaltfläche klicken und das gewünschte Bild mit dem anschließend erscheinenden Datei öffnen-Dialog auswählen.
Bild 1: Das Beispielformular mit einem Buchcover im Image-Steuerelement
Die Anwendung bietet auch die Möglichkeit, Buchinformationen per Webservice direkt von Amazon einzulesen. Diese Informationen enthalten auch Links zu Coverbildern in verschiedenen Auflösungen und die Anwendung liefert die Möglichkeit, diese Bilder von Amazon herunterzuladen und in der Datenbank zu speichern.
Werkzeug
Als Werkzeug für die in diesem Beitrag beschriebene Lösung dienen einige VBA-Routinen und API-Funktionen, die aus der Beispieldatenbank zum Beitrag Bilder im Griff mit VBA und GDI+ (Shortlink 337) stammen. Die hier verwendete Zusammenstellung wurde teilweise von Sascha Trowitzsch weiterentwickelt und vom Autor des vorliegenden Beitrags für den hier beschriebenen Anwendungsfall zusammengestellt.
Vom Web ins Image-Steuerelement
Für das Herunterladen einer Bilddatei aus dem Internet und ihre Anzeige in einem Formular brauchen Sie zunächst einmal die Funktion GetPictureFromURL aus dem Modul mdlOLE der Beispieldatenbank.
Diese Routine erwartet als Parameter die URL der Bilddatei, zum Beispiel http://www.access-im-unternehmen.de/fileadmin/images/aiu_2008_01.png.
Um die Routine auszuprobieren, brauchen Sie nur ein Microsoft Forms 2.0 Image-Steuerelement in ein Formular einzufügen, dieses beispielsweise objImage zu nennen und beim Laden des Formulars die folgende Routine auszuführen:
Private Sub Form_Load() Me!objImage.Picture = _ GetPictureFromURL( _ "http://www.access-im-unternehmen.de/€ _ €fileadmin/images/aiu_2008_01.png€) End Sub
Vom Web ins OLE-Feld
Nun soll das Bild aber nicht direkt angezeigt, sondern möglichst erstmal in der Datenbank gespeichert werden – und zwar in einem OLE-Feld in einer Tabelle Ihrer Wahl. In der Beispieldatenbank Buecherverwaltung.mdb heißt das Feld Bild und befindet sich in der Tabelle tblBuecher.
Die oben vorgestellte Funktion GetPictureFromURL dient als Ausgangspunkt für die folgende Vorgehensweise: Sie liefert nämlich immerhin schon einmal ein StdPicture-Objekt, das auf das Bild verweist.
Was aber muss passieren, damit dieses Bild-Objekt nun im OLE-Feld einer Tabelle landet und obendrein leicht wiederherstellbar ist Dank der Funktionen in den beiden Modulen mdlGDIPlus und mdlOLE lässt sich das ganz leicht herleiten. Genau genommen ist es fast wie bei Rechenaufgaben aus technischen Bereichen: Wenn man dort gar nicht mehr weiter weiß, schaut man sich halt die Einheiten an, in denen die Funktions- und Ergebniswerte angegeben werden müssen. Wenn man Einheiten durch Datentypen ersetzt, ist das eine interessante Analogie. Und eine zusätzliche Hilfe bieten natürlich die Funktionsnamen.
Wenn Sie ein StdPicture-Objekt in ein OLE-Feld einfügen möchten, durchsuchen Sie also erstmal die beiden Module nach Routinen, die irgendwas in ein OLE-Feld einsetzen.
Das erledigen sowohl SaveFileToOLEField als auch ArrayToOLEField. Die erste erwartet die Angabe einer Datei und speichert diese im OLE-Feld einer Tabelle, die zweite ein Byte-Array.
Wir müssen aus unserem StdPicture-Objekt also entweder eine Datei erstellen oder dieses in ein Byte-Array umwandeln. Ein Blick in die Liste der zur Verfügung stehenden Routinen zeigt, dass wir mit der Umwandlung von StdPicture zu Byte-Array richtig liegen – die Funktion ArrayFromPicture aus dem Modul mdlGDIPlus macht so etwas.