Bilder in Access, Teil 3: Bilder als Datenstrom in Access speichernIm dritten Teil dieser Beitragsreihe erfahren Sie, wie Sie Bilddateien in Form eines Binärstroms (auch Binary Large Object Bitmap, BLOB) in der Datenbank speichern. Diese Vorgehensweise ist etwas aufwendiger als die vorherigen beiden, aber speichert die Bilddaten komplett in der Datenbank und bläht diese dabei nicht auf.

Beiträge dieser Beitragsreihe:
Teil 1: OLE-Objekte in Tabellen speichern
Teil 2: Externe Bilder in Formularen anzeigen
Teil 3: Bilder als Datenstrom in Access speichern
Teil 4: Eingebettete Bilder als .jpg-Dateien exportieren BeispieldatenbankDie Beispieldatenbank BilderInAccess.mdb enthält die Beispiele der kompletten Beitragsreihe. Die Datenbank enthält mehrere Tabellen zum Speichern von Bildern sowie Formulare zur Anzeige und zum Importieren von Bilddaten.

Bilder als Binärstrom speichernWenn Sie Bilder als Binärstrom in einer Datenbank speichern, wird prinzipiell der Inhalt der jeweiligen Datei in der Datenbank gespeichert. Das hat gegebenüber der im ersten Teil dieser Beitragsreihe beschriebenen Methode den Vorteil, dass die Bilddateien nicht in ein anderes, speicherintensiveres Format umgewandelt werden, sondern nur unwesentlich mehr Platz als die Originaldateien beanspruchen.
Der Haken an der Sache ist, dass auf diese Weise gespeicherte Dateien so nicht direkt in einem Access-Formular oder -Bericht angezeigt werden können. Sie müssen das Bild erst wieder als Bilddatei auf der Festplatte speichern und diese dann in einem Bildsteuerelement anzeigen, indem Sie auf die Datei verweisen. Bild als Binärstrom in der Datenbank speichernBevor Sie überhaupt Bilder anzeigen können, die als Binärstrom in der Datenbank gespeichert sind, müssen Sie zunächst einmal eines dort speichern. Dazu sind einige Zeilen VBA-Code erforderlich, die Sie in den folgenden Abschnitten kennenlernen werden.
Ausgangspunkt ist das Formular frmBilderBLOB der Beispieldatenbank. Das Formular ist prinzipiell so aufgebaut wie die beiden Formulare aus den ersten beiden Teilen dieser Beitragsreihe. Es befindet sich aber eine zusätzliche Schaltfläche auf dem Formular, mit dem Sie für den aktuell angezeigten Datensatz ein Bild in der Datenbank speichern können.
Durch das Betätigen dieser Schaltfläche wird die folgende Prozedur ausgelöst:
Private Sub cmdBildHinzufuegen_Click()
Dim cnn As ADODB.Connection
Dim rst As New ADODB.Recordset
Dim Bildpfad As String
Bildpfad = InputBox("Bitte geben Sie den Bildpfad ein:", "Bildpfad eingeben", "")
If InStr(1, Bildpfad, Dir(Nz(Bildpfad, ""))) > 0 Then
Set cnn = CurrentProject.Connection
rst.Open "SELECT * FROM tblBilderBLOB WHERE BildID = " & Me!BildID, cnn, adOpenDynamic, adLockOptimistic
BildEinlesen Bildpfad, rst!BildBLOB
rst.Update
BildAnzeigen rst!BildBLOB
Else
Me!picBildBLOB.Picture = ""
MsgBox "Die angegebene Datei ist nicht vorhanden."
End If
End Sub
Die Prozedur fragt mit einem Eingabedialog den Dateinamen der einzubindenen Bilddatei ab und überprüft das Vorhandensein einer Datei dieses Namens. Sie öffnet den Datensatz der Tabelle tblBilderBLOB, der aktuell im Formular angezeigt wird, und ruft dann die Funktionen BildEinlesen und BildAnzeigen auf. Die erste Funktion dient zum Speichern der Bilddatei in der Tabelle, die zweite speichert diesen Binärstrom wieder auf der Festplatte und zeigt die so erzeugte Bilddatei in dem dafür vorgesehen Bildsteuerelement an. Dazwischen wird noch der aktuelle Datensatz mit dem neu hinzugefügten Bild gespeichert. Einlesen eines BildesDie Prozedur BildEinlesen erwartet die Angabe des Pfades zu der Bilddatei sowie einen Verweis auf das Feld der Tabelle tblBilderBLOB, in das die Bilddatei gespeichert werden soll.
Die Prozedur öffnet die angegebene Bilddatei und ermittelt ihre Größe. Die Bilddatei wird mit der Get-Funktion in der Byte-Variablen Buffer gespeichert. Nach dem Schließen der Bilddatei wird der Inhalt der Variablen Buffer mit der AppendChunk-Methode in das OLE-Feld eingelesen.
Private Sub BildEinlesen(Bildpfad As String, fldBildBLOB As Field)
Dim lngDateigroesse As Long
Dim Buffer() As Byte
Dim BilddateiID As Integer
BilddateiID = FreeFile
Open Bildpfad For Binary Access Read Lock Read Write As BilddateiID
lngDateigroesse = FileLen(Bildpfad)
ReDim Buffer(lngDateigroesse)
fldBildBLOB = Null
Get BilddateiID, , Buffer
Close BilddateiID
fldBildBLOB.AppendChunk Buffer
End Sub Anzeigen eines BildesDie Anzeige erfolgt genau andersherum. Die Prozedur BildAnzeigen erwartet einen Verweis auf das Feld mit der Bilddatei als Parameter. Mit der Funktion LenB wird wiederum die Größe der Bilddatei ermittelt und die Byte-Variable Buffer mit dem Inhalt der Bilddatei gefüllt. Dazu wird in dem Fall die Methode GetChunk verwendet. Die Put-Funktion dient zum Schreiben des Dateiinhalts in eine neue Datei namens c:\tempPic.
Schließlich stellt die Prozedur die Eigenschaft Picture des Bildsteuerelements des Formulars auf die neu erstellte Datei ein, wodurch diese angezeigt wird.
Private Sub BildAnzeigen(fldBildBLOB As Field)
Dim BilddateiID As Long
Dim Buffer() As Byte
Dim Dateigroesse As Long
BilddateiID = FreeFile
Dateigroesse = Nz(LenB(fldBildBLOB), 0)
If Dateigroesse > 0 Then
ReDim Buffer(Dateigroesse)
Open "c:\tempPic" For Binary Access Write As BilddateiID
Buffer = fldBildBLOB.GetChunk(Dateigroesse)
Put BilddateiID, , Buffer
Me!picBildBLOB.Picture = "c:\tempPic"
Else
Me!picBildBLOB.Picture = ""
End If
End Sub Aktualisieren des angezeigten Bildes beim DatensatzwechselDamit beim Wechseln des Datensatzes jeweils die zu dem aktuellen Datensatz gehörende Bilddatei angezeigt wird, verwenden Sie folgende Prozedur, die durch die Ereigniseigenschaft Beim Anzeigen ausgelöst wird:
Private Sub Form_Current()
Dim cnn As ADODB.Connection
Dim rst As New ADODB.Recordset
Dim strSQL As String
Set cnn = CurrentProject.Connection
If Me.NewRecord Then
Me.picBildBLOB.Picture = ""
Me!cmdBildHinzufuegen.Enabled = False
Exit Sub
Else
strSQL = "SELECT * FROM tblBilderBLOB WHERE BildID = " & Me!BildID
Me!cmdBildHinzufuegen.Enabled = True
End If
rst.Open strSQL, cnn, adOpenDynamic, adLockOptimistic
BildAnzeigen rst!BildBLOB
End Sub
Die Prozedur überprüft, ob es sich bei dem aktuellen Datensatz um einen neuen Datensatz handelt. Falls ja, wird kein Bild angezeigt und die Schaltfläche zum Hinzufügen eines Bildes deaktiviert. Wenn der aktuelle Datensatz bereits gespeichert ist, wird das entsprechende Bild durch den Aufruf der Prozedur BildAnzeigen angezeigt. Bild zu neuem Datensatz hinzufügenEinem neuen Datensatz können Sie keinen Datensatz hinzufügen. Daher wird die Schaltfläche zum Hinzufügen von Bildern jeweils deaktiviert, wenn ein neuer Datensatz angezeigt wird. |