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:
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