2017-09-02 5 views
3

Je recherche plusieurs fois dans Google, SO, et je ne trouve rien à propos de travailler avec une pièce jointe via Delphi, donc je décide d'écrire cette question.Delphi et pièces jointes dans la base de données d'accès MS

J'ai une table dans la base de données .accdb appelé Fichiers avec ces champs:

IDFile PK AutoIncField, 
FileName WideStringField, 
FilesAttached WideMemoFiled. 

enter image description here

Comment puis-je enregistrer des fichiers/de charge vers/à partir des champs de fixation à l'aide delphi?

Attach files and graphics to the records in your database

Le problème ici, en DELPHI le type de données FilesAttached est TWideMemoField, quand j'écris ShowMessage(FDTable1FilesAttached.Value); il donne juste le nom de la pièce jointe.

Je ne sais pas comment insérer/enregistrer des fichiers dans/à partir de ce champ en utilisant Delphi.

+0

@DownVoter Comme je le disais plus haut, ne vous contentez pas de nous dire ce qui ne va pas avec la question, quel est votre point de vue, même les visiteurs peuvent trouver ces commentaires utiles et faire mieux comprendre. – Sami

+0

@MartynA Vous voulez dire 'TBlobField (FDTable1FilesAttached)'? – Sami

+1

Le type de données de pièce jointe est une structure, pas seulement un flux de fichier (il peut contenir plusieurs fichiers.). Il n'y a pas de description officielle de cette structure et cela pourrait changer, donc j'éviterais d'utiliser ce type. P.S. ne tentez pas de cataloguer l'accès au champ ou le chemin proposé. – Victoria

Répondre

1

Il n'a pas semblé si difficile de trouver des exemples VBA/C# de travailler avec les champs de pièces jointes .accdb qui devraient se traduire assez facilement en Delphi. Cependant, il s'est avéré plus difficile que je ne l'imaginais de trouver quelque chose qui a) n'avait pas mal compris quels sont les champs de l'attachement et b) fonctionne réellement. Passez à la section mise à jour ci-dessous.

Par exemple, googler

accdb créer l'attachement à vba

donne de nombreux succès dont celui-ci

http://sourcedaddy.com/ms-access/working-with-attachment-fields.html

que vous pourriez essayer comme point de départ. Il utilise des objets MS DAO et inclut un code simple pour stocker des fichiers dans des champs de pièces jointes et pour y accéder. Vous devez créer une unité d'emballage Delphi pour la bibliothèque de type DAO, si vous ne possédez pas déjà un, en utilisant Import Type Library

de l'IDE Si vous préférez ADO quelque chose, vous pouvez jeter un oeil à

https://www.codeproject.com/Questions/843001/Handling-fields-of-Attachment-type-in-MS-Access-us

Mise à jour Voir la fonction OpenFirstAttachmentAsTempFile dans le post par "tremble" (date = 4/11/2012 7:18) dans ce fil

https://access-programmers.co.uk/forums/showthread.php?t=224112&page=2

qui montre une tentative apparemment réussie pour extraire un fichier d'un champ attachment (le thread contient également plusieurs autres tentatives de codage de cette fonction).

Notez en particulier cette ligne

Set rstChild = rstCurrent.Fields(strFieldName).Value ' the .Value for a complex field returns the underlying recordset 

ce qui implique que le Value du champ de fixation peut retourner un jeu d'enregistrements qui contient le fichier joint (s).

On peut supposer que l'importation d'une version récente de la bibliothèque de type DAO dans Delphi permettrait une application Delphi pour faire la même chose, et puis on pourrait désosser la rstChild recordset pour voir comment remplir ce champ dans le code. Je ne l'ai pas encore fait, cependant.

+0

Vous avez raison. En fait, sans ingénierie inverse de la structure de type de données 'Attachment' vous ne serez pas en mesure d'insérer une ligne dans une telle table. Vous pouvez lire les données du fichier joint en accédant à ces champs de colonne, comme par exemple 'SELECT FilesAttached.FileData FROM Files' et vous recevrez un champ blob avec les données du fichier (le tuple sera divisé en plusieurs lorsque plusieurs fichiers sont attachés ce champ). Comment insérer des données dans une telle table avec une bibliothèque cliente ODBC est un mystère. – Victoria

+0

@Victoria: Oui, bien. J'ai été amusé par le commentaire dans l'article ADO '// Faire quelque chose avec des données ...' - le fait sonner si facile; =) – MartynA

+0

Eh bien, ce sera blob en interne, je parie. Mais structuré, et si longtemps nous n'avons aucune définition de cette structure, nous pouvons seulement deviner. J'ai essayé sans succès. – Victoria