Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Bilder in Access, Teil 3: Bilder als Datenstrom in Access speichern

Im 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

Beispieldatenbank

Die 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 speichern

Wenn 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 speichern

Bevor 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 Bildes

Die 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 Bildes

Die 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 Datensatzwechsel

Damit 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ügen

Einem 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.

© 2003-2015 André Minhorst Alle Rechte vorbehalten.