Wie man Bilder in Access speichert, ist seit der Version 2010 eindeutig vorgegeben – nämlich in Anlagefeldern. Die Inhalte dieser Felder können auch leicht im Bild-Steuerelement angezeigt werden, dazu braucht man nur eine einfache Bindung an das entsprechende Feld. Allerdings bietet der SQL Server keinen solchen Datentyp, sondern nur verschiedene Alternativen. Dabei handelt es sich beispielsweise um den Datentyp VarBinary(max) oder um FILESTREAM. Die erstgenannte Alternative schauen wir uns im vorliegenden Beitrag an.
Beispielmaterial
Wir starten mit einer einfachen Beispieldatenbank, der wir eine Tabelle namens tblBilder hinzugefügt haben. Diese enthält die Felder wie in Bild 1.
Bild 1: Tabelle zum Speichern von Bildern
Hier haben wir unter anderem ein Anlagefeld eingefügt, dem wir nicht nur Bilder, sondern auch noch andere Dateien zuweisen können.
Hier können wir in der Datenblattansicht durch einen Doppelklick auf das im Anlagefeld angezeigt Büroklammer-Symbol einen Dialog namens Anlagen öffnen, mit dem wir die enthaltenen Anlagen verwalten können (siehe Bild 2).
Bild 2: Einfügen eines Bildes
Access-Bilder im Formular
Ein so eingefügtes Bild möchten wir auch im Formular anzeigen können. Dazu erstellen wir ein neues, leeres Formular, fügen diesem unsere Tabelle als Datensatzquelle hinzu und ziehen alle gewünschten Felder in den Formularentwurf.
Das Anlagefeld wird hier als Steuerelement des Typs Anlage hinzugefügt, das an das Anlagefeld der Tabelle gebunden ist.
Alternativ können wir auch ein Steuerelement des Typs Bild einfügen.
Der Unterschied zwischen diesen beiden Steuerelementen ist im Wesentlichen, dass wir mit dem Anlagefeld auch die enthaltenen Dateien verwalten können.
Dazu brauchen wir nur das Steuerelement anzuklicken und sehen dann das Menü wie in Bild 3.
Bild 3: Ein Bild im Anlage-Steuerelement
Hier können wir zwischen den Bildern wechseln, wenn das Anlagefeld mehrere enthalten sollte, und mit einem Klick auf die Büroklammer den Dialog Anlagen zum Verwalten der Anlagen aufrufen.
Das Bild-Steuerelement zeigt einfach nur das erste Bild im Anlagefeld an.
Anlagefeld im SQL Server?
Es wäre praktisch, wenn es im SQL Server einen entsprechenden Datentyp gäbe. Den gibt es allerdings nicht in dieser Form. Das erfahren wir auf die harte Tour, wenn wir versuchen, unsere Beispieldatenbank mit dem SQL Server Migration Assistant zu migrieren.
Die Fehlerliste aus Bild 4 zeigt, dass der Datentyp Attachment nicht unterstützt wird.
Bild 4: Meldung beim Versuch, ein Anlagefeld zum SQL Server zu migrieren
Es wird auch keine Alternative aufgezeigt, sondern das Feld wird einfach in eines mit dem Datentyp varchar(8000) migriert – das entnehmen wir dem Entwurf der neu erzeugten Tabelle im SQL Server Management Studio (siehe Bild 5).
Bild 5: Das Anlagefeld wird in ein Feld mit dem Datentyp varchar(8000) migriert.
Allerdings ist die Größe von 8.000 Zeichen etwas übertrieben – tatsächlich speichert die Tabelle nach der Migration nur noch den Namen der Datei in diesem Feld (siehe Bild 6).
Bild 6: Das Feld Bild enthält nun nur noch den Dateinamen.
Das heißt, dass der Ansatz über den SQL Server Migration Assistant hier nicht brauchbar ist und wir nacharbeiten müssen.
Wo und wie Bilder im SQL Server speichern?
Navigieren wir im SQL Server Management Studio durch die Datentypen, die uns die Entwurfsansicht für Tabellen anbietet, finden wir schnell den Eintrag image. Ist das nicht der passende Datentyp?
Schauen wir uns das einmal an. Zunächst einmal betrachten wir den Weg, dort ein Bild zu speichern. Dieser ist relativ einfach umzusetzen.
Wir nutzen eine einfache INSERT INTO-Anweisung, um dem image-Feld namens Bild2 ein Bild hinzuzufügen. Diese sieht wie folgt aus:
INSERT INTO tblBilder(Bild2) SELECT BulkColumn FROM OPENROWSET(BULK ''C:\...\pic001.png'', SINGLE_BLOB) AS Bild2
Die OPENROWSET-Funktion liest die angegebene Datei als einzelnen Datenblock (SINGLE_BLOB) und schreibt das Ergebnis in das Feld Bild2. Das Ergebnis sehen wir in Bild 7.
Bild 7: Hinzufügen eines Bildes per INSERT INTO-Anweisung
Zum Hinzufügen eines Bildes zu einem bestehenden Datensatz nutzen wir folgende Syntax:
UPDATE tblBilder SET Bild2 = ( SELECT bulkcolumn FROM OPENROWSET( BULK ''C:\...\pic002.png'', SINGLE_BLOB) AS Bild2) WHERE BildID = 1
Bild von image-Feld in Access anzeigen
Damit kehren wir zur Access-Datenbank zurück. Hier finden wir, da wir weiter oben die Tabelle tblBilder zum SQL Server migriert haben, nunmehr die Originaltabelle mit dem Namen SSMA$tblBilder$local vor sowie die verknüpfte Tabelle namens tblBilder.
Damit das Feld Bild2, das wir soeben zur SQL Server-Tabelle tblBilder hinzugefügt haben, auch in Access sichtbar wird, müssen wir die Verknüpfung aktualisieren. Das gelingt für eine einzelne Tabelle am einfachsten, indem wir für den Eintrag im Navigationbereich den Kontextmenü-Befehl Link aktualisieren aufrufen (siehe Bild 8).
Bild 8: Aktualisieren einer verknüpften Tabelle
Wenn wir uns nun die aktualisierte Tabellenverknüpfung ansehen, finden wir das Feld Bild2 mit dem Datentyp OLE-Objekt vor (siehe Bild 9).
Bild 9: Das image-Feld erscheint in Access als OLE-Objekt
Wechseln wir nun zur Datenblattansicht, um uns den Inhalt anzusehen, finden wir lediglich den Text OLE-Objekt vor (siehe Bild 10). Hier war nicht viel mehr zu erwarten, denn Tabellen können eben nur Texte und gegebenenfalls noch ein Kontrollkästchen anzeigen.
Bild 10: Der Inhalt wird ebenfalls als OLE-Objekt angezeigt.
Wie aber sieht es im Formular aus? Hier konnten wir die über den SQL Server eingefügten Bilddateien in keinem der verfügbaren Steuerelemente sichtbar machen.
image-Datentyp ist veraltet
Neben der Tatsache, dass es keinen einfachen Weg zu geben scheint, den Inhalt unseres image-Feldes in einem Access-Formular sichtbar zu machen, ist der image-Datentyp auch noch als veraltet gekennzeichnet.
Das heißt, er wird nur noch aus Gründen der Kompatibilität beibehalten. Der Datentyp kann aber auch in einer der folgenden SQL Server-Versionen schlicht entfallen.
Also schauen wir uns direkt nach Alternativen um.
Der Datentyp varbinary(max)
Eine weitere Möglichkeit, Bilder oder Dateien in einem Feld einer SQL Server-Datenbank zu speichern, ist der Datentyp varbinary(max).
Dieser erlaubt es ebenfalls, Bilder mit der folgenden Anweisung hineinzuschreiben:
INSERT INTO tblBilder(BildVarBinary) SELECT BulkColumn FROM OPENROWSET(BULK ''C:\...\pic001.png'', SINGLE_BLOB) AS BildVarBinary
Im Gegensatz zum Datentyp image ist der Datentyp varbinary(max) nicht veraltet.
Das Anzeigen von Bildern aus varbinary(max)-Feldern ist, soviel können wir bereits vorwegnehmen, auf verschiedene Arten möglich.
Damit allein ist es jedoch nicht getan, denn wir müssen uns um verschiedene Aufgaben kümmern:
- Bilder zu einem Datensatz anlegen: Wir müssen eine Schaltfläche hinterlegen, mit der wir einen Dateiauswahldialog öffnen und die dafür sorgt, dass die gewählte Bilddatei in der SQL Server-Tabelle gespeichert wird.
- Bilder auslesen und im Bild-Steuerelement anzeigen
Der erste Punkt ist etwas komplizierter, als er aussieht. Wir können hier nicht einfach die Methoden nutzen, die das Anlegefeld uns bietet, sondern müssen direkt auf den SQL Server zugreifen. Wie das gelingt, schauen wir uns nun an. Danach sehen wir zwei Methoden, um Bilder im Bild-Steuerelement anzuzeigen.
Verweis auf die ADODB-Bibliothek hinzufügen
Wir werden in diesem Beitrag auf die Methoden der ADODB-Bibliothek zugreifen. Diese bietet für unseren Anwendungsfall deutlich einfachere Methoden als die DAO-Bibliothek.
Dazu öffnen wir im VBA-Editor den Verweise-Dialog, in dem wir den Eintrag Microsoft ActiveX Data Objects 6.1 Library auswählen (siehe Bild 11).
Bild 11: Verweis auf die ADODB-Bibliothek
In dem Zuge legen wir auch gleich noch einen Verweis auf die Bibliothek Microsoft Office 16.0 Object Library an, den wir später für die Verwendung von Dateidialogen benötigen.
Zwei Methoden: Umweg über Datei oder direkter Weg
In den folgenden Abschnitten schauen wir uns zwei Varianten an, um ein Bild aus einem varbinary(max)-Feld einer SQL Server-Tabelle in einem Bild-Steuerelement anzuzeigen.
Die erste speichert das Bild im Dateisystem und referenziert dieses dann mit dem Bild-Steuerelement.
Die zweite liest das Bild aus dem varbinary(max)-Feld ein und weist es direkt dem Bild-Steuerelement zu.
Formular anlegen
Wir beginnen mit der Variante, mit der wir das Bild zunächst im aktuellen Datenbank speichern. Dazu legen wir zunächst das Formular frmBildVarBinary_Temp an. Diesem weisen wir die per ODBC verknüpfte Tabelle tblBilder als Datensatzquelle zu.
Wir fügen die beiden Felder BildID und Bezeichnung aus dieser Tabelle ein und legen zusätzlich eine Schaltfläche und ein Bild-Steuerelement an (siehe Bild 12).
Bild 12: Entwurf des Formulars zur Anzeige von Dateien aus dem varbinary(max)-Feld
Für das Bild-Steuerelement stellen wir die Eigenschaften Horizontaler Anker und Vertikaler Anker jeweils auf Beide ein. So wird das Steuerelement vergrößert, wenn wir das Formular vergrößern.
Hinzufügen eines Bildes
Zum Hinzufügen eines Bildes programmieren wir die Schaltfläche cmdBildAuswaehlen wie in Listing 1.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo