2009-05-13 5 views
2

Ich muss PDF-Dateien in einer Access-Datenbank auf einem freigegebenen Laufwerk mit einem Formular speichern. Ich habe herausgefunden, wie man das in Tabellen macht (mit dem OLE-Objekt-Feld, dann einfach per Drag-and-Drop), aber ich möchte dies in einem Formular tun, das eine Schaltfläche zum Speichern hat. Durch Klicken auf die Schaltfläche Speichern wird die Datei (nicht nur eine Verknüpfung) in der Datenbank gespeichert. Irgendwelche Ideen, wie man das macht?Speichern von PDFs in MS Access-Datenbank mit Forms

EDIT: Ich benutze Access 2003, und die DB wird auf einer Freigabe-Laufwerk gespeichert werden, so bin ich mir nicht sicher, die Verknüpfung zu den Dateien wird das Problem lösen.

+0

Sind Sie absolut sicher, dass Sie die PDFs in OLE-Feldern speichern möchten? Sie sagen nicht, welche Version von Access, aber vor 2007, gab es einen riesigen Aufwand dafür. Sofern nicht eine der oben genannten Anforderungen erfüllt ist, sollten Sie die Dateien im Dateisystem speichern und den Pfad/Dateinamen in ein Textfeld in der Datentabelle einfügen. –

+0

Diese Datenbank ist über ein Freigabe-Laufwerk zugänglich. So, wie ich es verstehe, wird das Dateisystem anders aussehen (basierend auf dem Laufwerk, dem der Benutzer unsere Freigabe zugeordnet hat). Deshalb haben wir keine Verknüpfung verwendet. Wenn wir diese Einschränkung vermeiden können, würde ich offensichtlich eine Verknüpfung verwenden, anstatt die Datei direkt zu speichern. –

+1

Dies ist ein alter Thread, aber ich sage niemals Matthews Antwort auf meine Frage. Dazu würde ich sagen: Verwenden Sie keine zugeordneten Laufwerke, sondern UNC-Pfade, die immer gleich sind, es sei denn, der Servername ändert sich oder die Freigabezuordnung ändert sich. Wenn eines dieser Dinge passierte, würden Laufwerkszuordnungen sowieso ungültig gemacht. –

Antwort

0

Vielleicht hilft das: ACC2000: Reading, Storing, and Writing Binary Large Objects (BLOBs).

Was sie tun: Lesen Sie eine Datei in Blöcken und fügen Sie sie mithilfe einer VBA-Funktion zu einem Blob hinzu.

+0

Ich bin wirklich neu (<1 Woche) zu Access und VBA, also scheint mir das furchtbar kompliziert. Ich denke, es macht das, was ich will, aber ist da etwas einfacher? –

0

Ein Feld des OLE-Objekts verwendet standardmäßig einen gebundenen Objektrahmen im Formular. Rechtsklicken Sie darauf und Sie können ein Objekt einfügen. Es kommt komplett mit Durchsuchen der Datei. Doppelklicken Sie auf das Feld und das aktuelle Dokument wird geöffnet.

Ich empfehle, mit Davids Rat und Link zu gehen. Es sei denn, Sie müssen eine einzelne Datei übertragen und möchten alle PDF-Dateien enthalten. Größe und Leistung werden ein Problem sein.

Wenn Sicherheit ein Problem darstellt und die Access-Datei das einzige Steuerelement ist, das Sie haben (Sie können keine Sicherheit für den Ordner festlegen, der alle verknüpften Dateien enthält.), Müssen Sie einbetten.

2

Wir haben mehrere Datenbanken, die Zehntausende von Dokumenten enthalten (pdf, doc, jpg, ...), überhaupt kein Problem. In Access, verwenden wir den folgenden Code ein binäres Objekt in ein binäres Feld zu laden:

Function LoadFileFromDisk(Bestand, Optional FileName As String = "") 
    Dim imgByte() As Byte 
    If FileName = "" Then FileName = strFileName 
    Open FileName For Binary Lock Read As #1 
    ReDim imgByte(1 To LOF(1)) 
    Get #1, , imgByte 
    Close #1 
    If Not IsEmpty(imgByte) Then Bestand.Value = imgByte 
End Function 

In diesem Fall Bestand ist das Feld, das die binären Daten enthält. Wir verwenden MS SQL Server als Backend, aber dasselbe sollte auf einem Access Backend funktionieren.

+0

@birger Danke für den Vorschlag. Ich habe versucht, diesen Code zu implementieren, aber so neu für VBA zu sein, kann ich nicht für das Leben von mir herausfinden, wie man es implementiert. Kannst du zum Beispiel erklären, was die "# 1" - und LOF-Namen bedeuten? –

+0

Eine Datei wird geöffnet und ihr wird eine Nummer zugewiesen (Nr. 1). imgByte ist ein Array von Bytes. Die Größe dieses Arrays wird auf die Länge der Datei 1: LOF (1) festgelegt. Die GET-Funktion liest die Datei und speichert sie in imgByte. An diesem Punkt ist imgByte ein Array von Bytes, die die Bilddatei darstellen. Der Feldwert Bestand wird dann auf dieses Array gesetzt und voila: Die Datei wird im Feld gespeichert. – Birger

+0

Bitte beachten Sie: Dies ist etwas anderes als das Speichern eines Objekts in einem OLE-Feld, da diese Methode die OLE-Wrapper nicht zur Datei hinzufügt. – Birger

1

Wenn Sie das gleiche Konzept verwenden, aber auf SQL Server upsized - das Speichern von PDFs innerhalb eines Image-Datentyps (oder varbinary (max)), können Sie die PDF-Dateien mit der Volltextsuche durchsuchen.

Ich zeige, dass Microsoft sagt, dass Sie dies für jeden Dateityp tun können, wo Sie ein IFILTER-Produkt registrieren können. Ich war neulich auf der Adobe-Website und sagte, dass ihr Acrobat IFILTER tatsächlich KOSTENLOS ist.

+0

Sehr interessant! Aber ich denke, das würde nur mit Objekten funktionieren, die als OLE gespeichert sind, nicht als Blob wie @ Birgers Antwort? –

+0

Ole in Access ist das gleiche wie Blobs in SQL Server .. Blobs sind im Grunde die gleichen, ob es ein IMAGE-Datentyp oder Varbinary (max) ist, etc. –

+0

Danke. Für den Speicher, aber wenn Sie "als OLE" speichern, legen Sie das Dokument (oder sogar einen Teil eines Dokuments) in einer Art Umschlag, einschließlich Informationen zu den möglichen Clients, eine Formatbeschreibung, eine Vorschau, etc ... Also ich frage mich, ob dieser OLE-Umschlag für iFilter erforderlich ist, um seine Arbeit zu erledigen? –