Dateien in Tabellen speichern

André Minhorst, Duisburg

“Dateien in einer Datenbank speichern – wer macht den so was Schon mit ein paar kleinen Bildchen bläht man sich doch die Datenbank schon maßlos auf!” – so ähnlich ist die Meinung der meisten Access-Anwender zum Thema dieses Beitrags. Dass es auch ohne Aufblähen geht und dass auch das Speichern anderer Dateien als Bilddateien in der Datenbank sinnvoll sein kann, erfahren Sie nachfolgend – und natürlich lernen Sie auch Funktionen kennen, die Ihnen dabei eine Menge Arbeit abnehmen.

Wenn man nicht gerade zu den Leuten gehört, die gerade einen aktuellen Anwendungsfall zum Speichern von Dateien in einer Access-Datenbank haben, fragen Sie sich vielleicht, welche Gründe es überhaupt für das Speichern von Dateien in einer Tabelle gibt.

Dafür gibt es genügend Anwendungsbeispiele; die bekanntesten davon beschäftigen sich vermutlich mit der Verwaltung von Bildern. In den gängigen Foren fragen Besucher ständig nach Möglichkeiten, um Bilder in Access zu speichern – und das möglichst ohne dass die Datenbank schneller als gewünscht eine Größe von zwei Gigabyte erreicht.

Aber es gibt noch andere gute Gründe für das Speichern von Dateien in einer Datenbank. Wenn Sie beispielsweise eine Datenbank weitergeben, ohne direkt eine aufwändige Installationsroutine mitzuliefern, können Sie eventuell zusätzlich benötigte Anwendungen beim Start der Datenbankanwendung ins Datenbankverzeichnis kopieren und dort verwenden.

Und wenn der Autor hier einmal aus dem Nähkästchen plaudern darf: Er verwendet die weiter unten vorstellten Funktionen, um alle im Online-Archiv enthaltenen .pdf- und Beispieldateien in einer Datenbank zu verwalten und diese bei Bedarf inklusive entsprechender Verzeichnisstrukturen (Jahrgang/Ausgabe/Beitrag …) auf der Festplatte zu speichern und entsprechend weiterzubearbeiten.

Ebenso leicht ist etwa die Verwendung eines kommandozeilengesteuerten Zip-Tools, um beliebige Dateien ins Filesystem zu kopieren, zu komprimieren und die Originaldateien anschließend wieder zu löschen.

Um die Vorgehensweise in den folgenden Kapiteln nachvollziehen zu können, benötigen Sie eine Access-Datenbank mit einer Tabelle zum Speichern von Daten. Den Entwurf dieser Tabelle können Sie Bild 1 entnehmen.

Bild 1: Entwurf der Tabelle zum Speichern von Dateien

Public Function DateiInOLEFeld(strTabelle As String, strPrimaerschluessel As String, _    strZielfeld As String, lngID As Long, Optional strFeldSpeicherort As String, _    Optional strSpeicherort As String, Optional bolImDatenbankpfad As Boolean) As Long
    Dim cnn As ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim strSpeicherortTemp As String, strSpeicherortName As String
    Dim lngExportdateiID As Long
    Dim Buffer() As Byte
    Dim lngDateigroesse As Long
    On Error GoTo DateiInOLEFeld_Err
    Set cnn = CurrentProject.Connection
    If Not strFeldSpeicherort = "" Then
        strSpeicherortTemp = ", " & strFeldSpeicherort
    Else
        strSpeicherortTemp = ""
    End If
    rst.Open "SELECT " & strZielfeld & strSpeicherortTemp & " FROM " & strTabelle _        & " WHERE " & strPrimaerschluessel & " = " & lngID, cnn, adOpenDynamic, _        adLockOptimistic
    lngExportdateiID = FreeFile
    If Not strFeldSpeicherort = "" Then
        strSpeicherortName = rst(strFeldSpeicherort)
    Else
        strSpeicherortName = strSpeicherort
    End If
    If bolImDatenbankpfad = True Then
        strSpeicherortName = Datenbankpfad & strSpeicherortName
    End If
    If Dir(strSpeicherortName) = "" Then
        MsgBox "Die Datei ''" & strSpeicherortName & "'' existiert nicht."
        Exit Function
    End If
    Open strSpeicherortName For Binary Access Read Lock Read Write As lngExportdateiID
    lngDateigroesse = FileLen(strSpeicherortName)
    ReDim Buffer(lngDateigroesse)
    rst(strZielfeld) = Null
    Get lngExportdateiID, , Buffer
    rst(strZielfeld).AppendChunk Buffer
    rst.Update
    Close lngExportdateiID
    DateiInOLEFeld = True
DateiInOLEFeld_Exit:
    rst.Close : Set rst = Nothing : Set cnn = Nothing
    Exit Function
DateiInOLEFeld_Err:
    DateiInOLEFeld = Err.Number
    Resume DateiInOLEFeld_Exit
End Function

Quellcode 1

Die Prozedur zum Speichern einer Datei in einem Feld einer Tabelle finden Sie in Quellcode 1. Der Code sieht relativ umfangreich aus, aber die Prozedur gleicht dies durch hohe Flexibilität aus.

Eingabeparameter der Prozedur

Schauen Sie sich zunächst die Eingabeparameter an:

  • strTabelle: Tabelle, in der die Datei gespeichert werden soll
  • strPrimaerschluessel: Name des Primärschlüsselfeldes in der Zieltabelle
  • strZielfeld: OLE-Feld, in dem die Datei gespeichert werden soll
  • lngID: ID des Datensatzes, dem die Datei hinzugefügt werden soll
  • strFeldSpeicherort: Optional für die Angabe des Namens eines Feldes mit dem Speicherort der zu importierenden Datei
  • strSpeicherort: Optional für die Angabe des Speicherorts der zu importierenden Datei
  • bolImDatenbankpfad: Gibt an, ob dem Speicherort das Verzeichnis, in dem sich die Datenbank befindet, vorangestellt werden soll
  • Beispielaufrufe der Prozedur

    Um nun beispielsweise eine Datei namens c:\test.pdf im Feld Datei der Beispieltabelle zu speichern, legen Sie zunächst einen neuen Datensatz in dieser Tabelle an (siehe Bild 2). Das Vorhandensein eines Datensatzes mit einem OLE-Feld ist Voraussetzung für den Einsatz dieser Prozedur.

    Rufen Sie die Funktion im Testfenster nun folgendermaßen auf:

    Bild 2: Ein Datensatz vor dem Import einer Datei

    DateiInOLEFeld "tblDateien", "DateiID", "Datei", 1, ,"c:\test.pdf",False

    Dieser Aufruf speichert die Datei c:\test.pdf in der Tabelle tblDatei im Feld Datei des Datensatzes mit dem Wert 1 im Primärschlüsselfeld DateiID.

    Nun können Sie mit dem .pdf-Dokument im OLE-Feld nicht allzu viel anfangen. Dass es aber dort angekommen ist, zeigt das erneute öffnen der Tabelle (siehe Bild 3).

    Bild 3: Das OLE-Feld ist nicht mehr leer.

    Eine zweite Variante für den Aufruf verwendet den Inhalt des Feldes Dateiname als Pfad für die zu importierende Datei:

    DateiInOLEFeld "tblDateien", "DateiID", "Datei", 1, "Speicherort", , False

    Durch die Angabe des Wertes “Speicherort” für den Parameter strFeldSpeicherort importiert die Funktion die in diesem Feld angegebene Datei – falls Sie die Datei aus dem vorherigen Beispiel nicht gelöscht haben, wird diese einfach überschrieben.

    Diese beiden Varianten können beide mit der Möglichkeit, den aktuellen Datenbankpfad einzubauen, kombiniert werden.

    Wenn Sie den Dateinamen im Funktionsaufruf übergeben möchten, verwenden Sie den reinen Dateinamen ohne Pfadangabe und übergeben für den Parameter bolImDatenbankpfad den Wert True. Das Gleiche gilt, wenn Sie den in der Tabelle gespeicherten Dateinamen verwenden möchten – geben Sie einfach den puren Dateinamen an und verwenden Sie die obige Option.

    Aufbau der Prozedur

    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

    Schreibe einen Kommentar