IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

Stocker / Extraire des fichiers dans une base Access


Sujet :

Bases de données Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Stocker / Extraire des fichiers dans une base Access
    Voila, je voudrais utiliser une base access pour stocker des fichiers (Word, Excel, Pdf...) et les ressortir quand j'en ai besoin.

    J'ai créé sous Access une base dans laquelle j'ai créé 2 champs : 'Objet' qui contient mon fichier et 'Name' qui contient le nom du fichier. Depuis Access, quand j'insère manuellement des fichiers Word dans ma table, ils apparaissent sous forme de "Packages".

    Pour extraire un fichier je fais une simple requête :


    ADOQuery1.SQL.add(SELECT Table.Objet FROM Table);
    ADOQuery1.open;
    ADOQuery1.first;
    S:=Adoquery1.FieldbyName('Objet').AsString;


    ...Et je copie la string dans un fichier texte. Mais en fait, à l'exécution, je m'aperçois que le fichier généré n'a pas la bonne structure, il semble contenir "trop" de données...

    Une idée ?
    ----------------------------------------------------
    Votre application est buggée : elle me force à réfléchir

  2. #2
    Membre averti Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Points : 392
    Points
    392
    Par défaut
    Quel est le type du champ "Objet" ?
    Etant donné que les fichiers à stocker doivent être considéré comme des données brutes, tu doit utiliser le type "Blob".

    La table Access doit avoir en plus un champ clé disons autoincrémenté.
    ....................................................................
    Aidez-vous... Dieu vous aideras et nous aussi..
    ....................................................................

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Comme type, j'ai sélectionné "Objet OLE". Ce qui selon moi correspond effectivement à un BLOB.

    Mon problème, c'est justement que dans mon fichier extrait j'ai tout un tas de données correspondent à l'encapsulation OLE (le chemin du fichier, son nom, son appli par défaut...). Et je voudrais pouvoir supprimer ces informations pour récupérer mon fichier initial.
    ----------------------------------------------------
    Votre application est buggée : elle me force à réfléchir

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Voici une QR qui sera publié à la prochaine fournée qui te permettra de voir comment inclure ou extraire des données d'une base.


    [QR] Comment insérer et récupérer un fichier dans un champ de type BLOB ?

    Cette QR prendra exemple avec les composants ADO mais elle est fonctionnel avec n'importe quel composant de base de données.

    Dans les exemples qui vont suivres, on considèrera que nous travaillons sur la structure de table suivante :

    Id : Champ auto incrémenté
    Nom : Champ texte/varchar de 100 en taille
    Fichier : Champ Blob

    A- L'insertion

    Il y a 2 méthodes pour insérer des documents (Images ,Documents Texte, programmes, etc ...) dans une base de données :

    1- Par chargement
    a- Avec une requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    if OpenDialog.execute then
      With AdoQuery do
      begin
        Close;
        SQL.Clear;
        SQL.add('insert into MaTable(Nom,Fichier)');
        SQL.Add('Values(:PNom,:PFichier)');
        ParamCheck := True;
        Parameters.ParamByName('PNom').Value := ExtractFileName(OpenDialog.Filename);
        Parameters.ParamByName('PFichier').LoadFromFile(OpenDialog.Filename, ftBlob);
      try
        ExecSQL;
      Except on E:Exception do
        begin
          Showmessage('Erreur lors de l'insertion de l''image dans la base de données : ' + 
           E.Message);
        end;
      end; 
    end;
    b- Avec une table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    if OpenDialog.execute then
      With AdoTable do
      begin
         // Met la table en mode insertion de données
         Append; 
        // enregistrement du nom de fichier dans la base de données
        FieldByName('Nom').asString := ExtractFileName(OpenDialog.Filename);
        // Enregistrement du fichier dans la base de données
        (FieldByName('Fichier') as TBlobField).LoadFromFile(OpenDialog.Filename, ftBlob);
      try
         // On ajoute dans la base de données
         Post; 
      Except on E:Exception do
        begin
          // On annule la tentative d'ajout dans la base de données
          Cancel; 
          Showmessage('Erreur lors de l'insertion de l''image dans la base de données : ' + 
            E.Message);
        end;
      end; 
    end;
    2- Par assignation

    Cette méthode nécessite que l'on connaisse à l'avance le type de données que l'on va transmettre à la base de données.
    Dans les deux exemples qui vont suivre, nous utiliseront des images.
    a- Avec une Requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    var
      Img : TBitmap;
    begin
      if OpenDialog.execute then
      try
         img := TBitmap.Create;
         img.LoadFromFile(OpenDialog.FileName);
        With AdoQuery do
        begin
          Close;
          SQL.Clear;
          SQL.Add('insert into MaTable(Nom,Fichier)');
          SQL.Add('Values(:PNom,:PFichier)');
          ParamCheck := True;
          Parameters.ParamByName('PNom').Value := ExtractFileName(OpenDialog.Filename);
          Parameters.ParamByName('PFichier').Assign(Img);
          try
            ExecSQL;
          Except on E:Exception do
            begin
              Showmessage('Erreur lors de l'insertion de l''image dans la base de données : ' + 
              E.Message);
            end;
          end; 
        end;
      finally
        img.free;
      end;
    end;
    b- Avec une Table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    var
      Img : TBitmap;
    begin
      if OpenDialog.execute then
      try
         img := TBitmap.Create;
         img.LoadFromFile(OpenDialog.FileName);
         With AdoTable do
        begin
         // Met la table en mode insertion de données
         Append; 
         // enregistrement du nom de fichier dans la base de données
         FieldByName('Nom').asString := ExtractFileName(OpenDialog.Filename);
         // Enregistrement du fichier dans la base de données
         FieldByName('Fichier').Assign(Img);
         try
           // On ajoute dans la base de données
           Post; 
         Except on E:Exception do
           begin
             // On annule la tentative d'ajout dans la base de données
              Cancel; 
             Showmessage('Erreur lors de l'insertion de l''image dans la base de données : ' + 
              E.Message);
           end;
         end; 
       end;
      finally
        img.free;
      end;
    end;
    B- La récupération

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    var
      sPath : String
    begin
      With AdoTable do
      begin
        // Récupération du nom du fichier
        sPath := ExtractFilePath(Application.ExeName) + FieldByName('Nom').AsString;
        // sauvegarde du fichier
        TBlobField(FieldByName('Fichier')).SaveToFile(sPath);
      end;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre averti Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Points : 392
    Points
    392
    Par défaut
    Houla ! j'allais dire ou plutot écrire deux mots et voila un fleuve qui se déverse !
    Bravo MALATAR !
    ....................................................................
    Aidez-vous... Dieu vous aideras et nous aussi..
    ....................................................................

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    WOW ! Quelle rapidité !!

    Et en plus, évidemment, ça marche nickel !!!

    Bravo et Merci !!!
    ----------------------------------------------------
    Votre application est buggée : elle me force à réfléchir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. stocker des fichiers dans une base de données avec java
    Par dali0802 dans le forum Général Java
    Réponses: 4
    Dernier message: 08/04/2014, 17h21
  2. Réponses: 1
    Dernier message: 04/01/2012, 18h08
  3. stocker des fichiers dans une base de donnée MYSQL
    Par Invité(e) dans le forum MySQL
    Réponses: 5
    Dernier message: 03/12/2009, 13h10
  4. Stocker des photos dans une base access
    Par codial dans le forum Bases de données
    Réponses: 14
    Dernier message: 27/03/2007, 17h26
  5. Interet de mettre des fichiers dans une base de donnée
    Par Oberown dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 04/07/2005, 11h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo