Warum noch ein Access-Buch?
Für wen ist das Buch?
Jetzt bestellen
+ direkter Download des eBooks!
Nur EUR 59,95!
Fehler gefunden?
Bitte melden!
Wünsche an das Buch?
Her damit!
Was denken die Leser über dieses Buch?
Lesen Sie aktuelle Rezensionen!
Kapitel des noch nicht veröffentlichten Buchs zum Downloaden, Probelesen und Kommentieren
Beispieldatenbanken
Zusätzliches Material

Das Buch im HTML-Format

Für unbestimmte Zeit bieten Addison-Wesley und André Minhorst den kompletten Inhalt des Buchs als Download an. Schauen Sie rein und informieren Sie sich über den Inhalt! Und wenn Ihnen das Buch nützlich erscheint und Sie glauben, dass Sie etwas gelernt haben oder durch das Gelesene sogar etwas Zeit und somit Geld bei Ihrer Arbeit einsparen konnten, können Sie sich ja beim Autor und beim Verlag revanchieren - beispielsweise durch den Kauf dieses Buchs.

Am schönsten wäre es natürlich, wenn Sie das Buch direkt hier bestellen - Sie erhalten das Buch dann direkt vom Verlag, und der Autor und Verlag haben dann noch mehr davon, als wenn Sie es anderswo kaufen.

Danke für Ihr Interesse!

9.9.5 Attachment-Felder auslesen

9.9.6 Dateien aus einem Attachment-Feld auf der Festplatte speichern

DAO liefert natürlich auch eine Methode, mit der Sie den Inhalt eines Attachment-Feldes leicht auf der Festplatte speichern können: SaveToFile. Es handelt sich dabei um eine Methode des Field2-Objekts und die nur angewendet werden kann, wenn Sie ein Recordset2-Objekt auf Basis des Attachment-Feldes der betroffenen Tabelle erzeugt haben. Die folgende Routine zeigt anschaulich, wie das funktioniert: Sie löscht zunächst eventuell vorhandene Dateien gleichen Namens und schreibt dann die Attachments aller Datensätze in dieses Verzeichnis.

Public Sub AttachmentsExportieren()
    Dim db As DAO.Database
    Dim rst As Recordset2
    Dim rstAttachments As Recordset2
    Dim fld As Field2
    Dim strAttachment As String
    
    Set db = CurrentDb
    Set rst = db.OpenRecordset("tblDateien", dbOpenDynaset)
    Do While Not rst.EOF
        Set rstAttachments = rst.Fields("Datei").Value
        Do While Not rstAttachments.EOF
            Set fld = rstAttachments.Fields("Filedata")
            strAttachment = CurrentProject.Path & "\" _
                & rstAttachments.Fields("FileName")
            On Error Resume Next
            Kill strAttachment
            On Error GoTo 0

            fld.SaveToFile strAttachment
            rstAttachments.MoveNext
        Loop
        rst.MoveNext
    Loop
        
    rst.Close
    Set rst = Nothing
    Set db = Nothing
End Sub

Listing 9.49: Speichern aller Anlagen einer Tabelle

Für den Praxiseinsatz können Sie diese Routine etwa dahingehend aufbohren, dass Attachments jeweils in Verzeichnissen gespeichert werden, die in Abhängigkeit von den übergeordneten Datensätzen erstellt und benannt werden - und natürlich können Sie auch nur einzelne Attachments speichern.

Limitierung durch Dateiendungen

Wichtig ist außerdem, dass manche Dateitypen (etwa EXE-Dateien) vom Speichern in Attachments ausgeschlossen sind. Wenn Sie dies über die Benutzeroberfläche versuchen, erscheint noch eine aussagekräftige Meldung, beim Importieren einer Datei mit nicht zugelassender Endung per VBA liefert Access allerdings einen Laufzeitfehler mit unbekannter Fehlermeldung (»Unknown Error-message«).

Gleiches gilt für das Speichern solcher Dateien: Immerhin könnte man auf die Idee kommen, Dateien mit nicht erlaubter Dateiendung vor dem Speichern in einem Attachment-Feld umzubenennen und dies anschließend durch Anpassen der Filename-Eigenschaft wieder rückgängig zu machen. Sollten Sie also auf diese Weise eine nicht erlaubte Datei in einem Attachment-Feld speichern und dieses mit SaveToFile wieder exportieren wollen, erhalten Sie ebenfalls eine entsprechende Fehlermeldung.

Die genannte Limitierung lässt sich allerdings aushebeln: Die im Anlagefeld befindlichen Dateien verbergen sich im Binärfeld FileData der verborgenen Tabelle - dort sind sie Byte für Byte abgespeichert. Sie können das Binärfeld also etwa in eine Byte-Array- oder eine Variant-Variable einlesen und deren Inhalt dann in einer Datei abspeichern. Das wäre ein programmierter Ersatz für die SaveToFile-Methode, der auch das Wiederherstellen blockierter Daten erlaubt.

Allerdings ist der Datei im Binärfeld noch ein Header von variabler Länge vorangestellt, der zusätzliche Informationen zur Datei enthält. Wie groß dieser ist, können Sie aus dem ersten Element des Byte-Arrays ermitteln. Es enthält die Länge des Headers. Folglich beginnt die eigentliche Datei bei einem Offset im Array, der dieser Länge entspricht. Weitere Informationen hierzu erhalten Sie in Kapitel 11, »Bilder und binäre Dateien«. Dort finden Sie auch Details über die Komprimierung von in Attachments gespeicherten Dateien.

Nächster Abschnitt:

9.9.7 Datei in Attachment-Feldern speichern

© 2006-2008 André Minhorst Alle Rechte vorbehalten.