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

SQLite Discussion :

Insérer et récupérer une image


Sujet :

SQLite

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par défaut Insérer et récupérer une image
    Bonjour,

    je souhaiterais savoir comment faire pour enregistrer d'une façon simple une image dans une table. (C# + SQLite)

    j'ai fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // pour la creation de la table 
    SQLCmd.CommandText = "CREATE TABLE personne (nom VARCHAR(255), prenom VARCHAR(255), salaire INTEGER, image BLOB);";
     
    // pour l insertion 
    byte[] b = ... //contient l'image en bytes
    SQLCmd.CommandText = "INSERT INTO personne (nom, prenom, salaire, image) VALUES ('" + nom + "', '" + prenom + "', " + salaire + ", '" + b + "');";
    voila et au moment de la récupération j'ai fait un GridView lié a ma base, il m'affiche erreur lors du chargement des données de la base !!!

    pour récupérer j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ...
     SQLCmd.CommandText = "SELECT * FROM personne WHERE nom = " + nom;
                SQLiteDataReader SQLDReader = SQLCmd.ExecuteReader();
                while (SQLDReader.Read())
                {
                    elt.Nom = SQLDReader["nom"].ToString();
                    elt.Prenom = SQLDReader["prenom"].ToString();
                    elt.Salaire = int.Parse(SQLDReader["salaire"].ToString());
                    elt.Img =  (byte[])SQLDReader["image"];
     
                    return elt;
                }
    voila je ne sais plus quoi faire

  2. #2
    Membre expérimenté

    Inscrit en
    Décembre 2004
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 169
    Par défaut
    Bonjour,

    Commençons par ta requête de chargement.
    SQLCmd.CommandText = "INSERT INTO personne (nom, prenom, salaire, image) VALUES ('" + nom + "', '" + prenom + "', " + salaire + ", '" + b + "');";
    Imaginons que ton image contienne une seule fois le caractère guillemet (0x22), alors nous aurons un SQL qui aurait cette forme :
    INSERT INTO ... bla bla ... VALUES ( ... bla bla ... ","...debut image..."... fin image...");

    Tu vois alors que ce caractère guillemet (et je ne parle même pas de l'octet 00 très commun) au milieu de ton image explose la requête et la rend incompréhensible au parseur de SQLite. Donc, ce n'est pas la bonne solution.

    Par contre, si tu convertis ton binaire d'image en une chaine hexadécimale, tu arrives à insérer correctement la donnée :
    Exemple d'une image JPG commençant par les octets FF D8 FF E0 00 10 4A 46 49 46 ... etc. Tu peux alors écrire cette requête :

    INSERT INTO ... bla bla ... VALUES ( ... bla bla ... ", X'FFD8FFE000104A464946 ... etc ... ');

    La lettre X devant l'apostrophe indique un codage d'un BLOB; tu termines le BLOB par une autre apostrophe.

    Tu as un exemple en C d'une fonction qui fait cette conversion dans les sources de SQLite (shell.c) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    *
    ** Output the given string as a hex-encoded blob (eg. X'1234' )
    */
    static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){
      int i;
      char *zBlob = (char *)pBlob;
      fprintf(out,"X'");
      for(i=0; i<nBlob; i++){ fprintf(out,"%02x",zBlob[i]); }
      fprintf(out,"'");
    }
    L'étude de ce petit code te donnera un bon exemple.

    Ensuite, pour la lecture du champ... et bien il me semble que cela devrait aller car le BLOB contient bien l'image en binaire.

    Donne nous de tes nouvelles,
    ++

Discussions similaires

  1. Insérer et récupérer une image dans une base mysql
    Par 08353934 dans le forum Bases de données
    Réponses: 1
    Dernier message: 31/01/2008, 10h34
  2. [Mpeg4] récupérer une image d'un flux MPEG4.
    Par Drizztrobber dans le forum Multimédia
    Réponses: 10
    Dernier message: 19/03/2007, 10h01
  3. Récupérer une image JPEG à partir d'une vidéo
    Par kurul1 dans le forum C++Builder
    Réponses: 8
    Dernier message: 09/08/2006, 10h51
  4. récupérer une image du presse papier
    Par amelhog dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/08/2005, 10h18
  5. [Swing] récupérer une image d'un composant
    Par klemouf dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 16/09/2004, 10h24

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