2009-05-13 10 views
2

Je dois stocker des fichiers PDF dans une base de données Access sur un lecteur partagé à l'aide d'un formulaire. J'ai compris comment faire cela dans les tables (en utilisant le champ objet OLE, puis glisser-déposer) mais je voudrais le faire sur un formulaire qui a un bouton Enregistrer. Cliquez sur le bouton Enregistrer pour stocker le fichier (pas seulement un lien) dans la base de données. auriez vous des idées pour faire ça? J'utilise Access 2003, et la base de données sera stockée sur un lecteur de partage, donc je ne suis pas sûr que la liaison aux fichiers résoudra le problème.Stockage de fichiers PDF dans la base de données MS Access à l'aide de formulaires

+0

Etes-vous absolument certain de vouloir stocker les fichiers PDF dans les champs OLE? Vous ne dites pas quelle version d'Access, mais avant 2007, il y avait des frais généraux énormes pour cela. À moins qu'il y ait une exigence non-mentionnée, il est préférable de stocker les fichiers dans le système de fichiers et de simplement placer le chemin/nom de fichier dans un champ de texte dans votre table de données. –

+0

Cette base de données sera accessible depuis un lecteur de partage. Donc, si je comprends bien, le système de fichiers sera différent (basé sur le lecteur auquel l'utilisateur a mappé notre part). C'est pourquoi nous n'utilisions pas de lien. Si nous pouvons éviter cette limitation, évidemment je voudrais utiliser la liaison au lieu de stocker le fichier directement. –

+1

Ceci est un vieux fil, mais je ne dis jamais la réponse de Matthew à ma question. Pour cela, je dirais: n'utilisez pas de lecteurs mappés, mais utilisez des chemins UNC, qui seront toujours les mêmes à moins que le nom du serveur ne change ou que le mappage de partage ne change. Si l'une ou l'autre de ces choses se produisait, les mappages de lecteurs seraient invalidés, de toute façon. –

Répondre

0

Peut-être que cela aidera: ACC2000: Reading, Storing, and Writing Binary Large Objects (BLOBs). Ce qu'ils font: Lire un fichier en morceaux et l'ajouter à un blob en utilisant une fonction VBA.

+0

Je suis vraiment nouveau (<1 semaine) pour Access et VBA, donc cela me semble terriblement compliqué. Je pense que ça fait ce que je veux, mais y a-t-il quelque chose de plus simple là-bas? –

0

Un champ d'objet OLE, par défaut utiliserait un cadre d'objet lié sur le formulaire. Faites un clic droit dessus et vous pouvez insérer un objet. Il est livré avec la navigation pour le fichier. Double-cliquez sur le champ et le document réel s'ouvrira.

Je recommande d'aller avec les conseils et le lien de David. Sauf si vous avez besoin de transférer un seul fichier et que vous voulez que tous les PDF soient inclus. La taille et la performance seront un problème.

Si la sécurité est un problème et le fichier Access est le seul contrôle que vous avez (Vous ne pouvez pas définir la sécurité sur le dossier contenant tous les fichiers liés.), Alors vous devrez intégrer.

2

Nous avons plusieurs bases de données contenant des dizaines de milliers de documents (pdf, doc, jpg, ...), pas de problème du tout. Dans Access, nous utilisons le code suivant pour télécharger un objet binaire à un champ binaire:

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 

Dans ce cas, Bestand est le champ qui contient les données binaires. Nous utilisons MS SQL Server en tant que backend, mais la même chose devrait fonctionner sur un backend Access.

+0

@birger Merci pour la suggestion. J'ai essayé d'implémenter ce code, mais étant si nouveau à VBA je ne peux pas pour la vie de moi comprendre comment l'implémenter. Pourriez-vous expliquer, par exemple, ce que signifient les noms «# 1» et LOF? –

+0

Un fichier est ouvert et un numéro lui est affecté (# 1). imgByte est un tableau d'octets. La taille de ce tableau est définie sur la longueur du fichier 1: LOF (1). La fonction GET lit le fichier et le stocke dans imgByte. À ce stade, imgByte est un tableau d'octets représentant le fichier image. La valeur du champ Bestand est ensuite définie sur ce tableau et voila: le fichier est stocké dans le champ. – Birger

+0

Terminez s'il vous plaît noter: c'est autre chose que le stockage d'un objet dans un champ OLE, parce que la méthode this n'ajoute pas les wrappings OLE au fichier. – Birger

1

Si vous utilisiez le même concept, mais migré vers SQL Server - stockant des fichiers PDF à l'intérieur d'un type de données Image (ou varbinary (max)), vous pouviez RECHERCHER LES PDF en utilisant la recherche plein texte. Je montre que Microsoft dit que vous pouvez le faire pour tout type de fichier où vous pouvez enregistrer un produit IFILTER .. et je viens d'être sur le site Web d'Adobe l'autre jour et dire que leur Acrobat IFILTER est en effet GRATUIT.

+0

Très intéressant! Mais je suppose que cela ne fonctionnerait qu'avec des objets stockés comme OLE, pas comme des blobs comme la réponse de @ birger? –

+0

ole dans Access est le même que blobs dans SQL Server .. blobs sont fondamentalement les mêmes que ce soit un type de données IMAGE ou varbinary (max), etc –

+0

Merci. Accepté pour le stockage, mais quand vous stockez "comme OLE", vous mettez le doc (ou même une partie d'un doc) dans une sorte d'enveloppe, y compris des informations sur les clients possibles, une description de format, un aperçu, etc ... Donc je me demandais si cette enveloppe OLE est nécessaire pour que iFilter fasse son travail? –

Questions connexes