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

Lazarus Pascal Discussion :

Insérer des octets dans un champ BLOB


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Insérer des octets dans un champ BLOB
    Bonjour à toutes et à tous,

    Je suis un pur débutant en base de données.

    J'utilise SqLite et j'ai cru comprendre que les instructions de gestion de cette base étaient les mêmes que pour SQL.

    Dans les instructions qui suivent, si je remplace les ????? de la dernière instruction par une valeur numérique, il n'y a pas de problème.

    Maintenant, je voudrais remplacer cette valeur numérique par une suite d'octets représentant par exemple les pixels d'une image. Je n'ai pas triouvé d'exemple sur le WEB. Qu'est-ce que j'écris à la place des ?????.

    Merci de votre aide.

    Pierre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       SQLite3Connection.ExecuteDirect('CREATE TABLE tiles('+
                       ' x int,'+
                       ' y int,'+
                       ' z int,'+
                       ' image BLOB,'+
                       ' PRIMARY KEY (x, y, z));');
        SQLite3Connection.ExecuteDirect('INSERT INTO tiles VALUES (2, 3, 15,?????);

  2. #2
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    Salut

    En parcourant rapido les source du composant, je ne suis pas convaincu que cela soit faisable directement avec une composant TSQLite3Connection, des méthodes liées à la gestion des Blobs existent mais elles sont protégées et sans doute réservées à l'usage des composants d'accès.
    Piste : employer un composant TSQLQuery et accéder aux méthodes suivantes du champ TBlobField :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        procedure LoadFromFile(const FileName: string);
        procedure LoadFromStream(Stream: TStream);
        procedure SaveToFile(const FileName: string);
        procedure SaveToStream(Stream: TStream);
    Attention ces méthodes sont spécifiques aux objets TBlobField, il faut donc prendre des précautions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       (SqlQuery1.FieldByName('Image') as TBlobField).LoadFromFile('C:\MonImage.jpg');
    Pas le temps de donner une réponse plus détaillée, je file au boulot.

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  3. #3
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par e-ric Voir le message
    ... Attention ces méthodes sont spécifiques aux objets TBlobField, il faut donc prendre des précautions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       (SqlQuery1.FieldByName('Image') as TBlobField).LoadFromFile('C:\MonImage.jpg');
    ...
    Merci e-ric pour cette réponse.

    Comme je le disais dans mon premier post, je suis un débutant en base de données.

    Insérant l'instruction ci-dessus dans mon programme, cela ne fonctionne pas car il ne connait pas le champ 'Image'. Je suppose qu'il faut référencer ce champs par d'autres informations ... tiles.image ??? Je ne sais quoi donner comme information.

    Pour autant, j'ai essayé de charger directementun fichier en utilisant un TBlobField : ça plante. Voici ce que j'ai écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      BlobField: TBlobField;
    begin
      BlobField:= TBlobField.Create(TComponent(Self));
      BlobField.SetFieldType(ftGraphic); // j'ai essayé avec divers ft..., ça plante tout pareil
      if OpenDialog.Execute then;
        BlobField.LoadFromFile(OpenDialog.FileName);
    Ça plante au chargement du fichier avec le message suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    le projet ... a levé une exception de class "External SIGSEGV" at Address ...
    Merci de votre aide.

    Pierre

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mai 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 33
    Par défaut
    Je répond pas à la question car j'ai pas eu le temps d'y songer mais simplement je pense qu'il est pas très judicieux de sauvegarder des images dans une BDD et encore moins dans une base SQLITE. Il vaut mieux sauvegarder les images dans un dossier et inscrire uniquement dans la BDD le nom du fichier avec d'autres infos pourquoi pas comme la taille, etc... Lightroom par exemple fonctionne comme çà et utilise une base SQLITE...

  5. #5
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par SoftChris Voir le message
    Je répond pas à la question car j'ai pas eu le temps d'y songer mais simplement je pense qu'il est pas très judicieux de sauvegarder des images dans une BDD et encore moins dans une base SQLITE....
    Ce n'est peut-être pas judicieux, mais je dois m'adapter à de l'existant (OruxMaps) qui l'utilise.

    Cordialement.

    Pierre

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    Bonsoir,
    Sans connaître les composants d'accès aux données, il me semble que tu dois avoir besoin d'un intermédiaire. D'ailleurs, http://www.freepascal.org/docs-html/...blobfield.html dit :
    It should never be necessary to create an instance of TBlobField manually, a field of this class will be instantiated automatically for each BLOB field when a dataset is opened.
    On peut donc pê utiliser un DataSet dans lequel il n'y aurait que la ligne insérée (sans son BLOB) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQLite3Connection.ExecuteDirect('CREATE TABLE tiles('+
                       ' x int,'+
                       ' y int,'+
                       ' z int,'+
                       ' image BLOB,'+
                       ' PRIMARY KEY (x, y, z));');
    SQLite3Connection.ExecuteDirect('INSERT INTO tiles (x, y, z) VALUES (2, 3, 15)');
      // après l'insertion, sélection de la ligne dans un dataset
    aDataSet.SQL := 'SELECT * FROM tiles WHERE rowid = last_insert_rowid'; // mais quel type de DataSet ???
      // puis interaction avec son champ BLOB
    aDataSet.FieldByName('image') as TBlobField).LoadFromFile('C:\MonImage.jpg');
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

Discussions similaires

  1. Insérer des octets dans un BLOB
    Par ChPr dans le forum SQLite
    Réponses: 3
    Dernier message: 08/11/2014, 08h36
  2. Impossible d'insérer des valeurs dans un champ
    Par Sixpounder dans le forum Paradox
    Réponses: 1
    Dernier message: 08/07/2011, 16h00
  3. Lecteur des fichiers présents dans un champ blob
    Par qmike dans le forum Langage
    Réponses: 0
    Dernier message: 21/07/2010, 13h58
  4. Insérer des octets dans un fichier
    Par Hell dans le forum Langage
    Réponses: 7
    Dernier message: 13/08/2008, 10h45

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