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

Windows Forms Discussion :

[C#] Serialisation images DB access


Sujet :

Windows Forms

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 111
    Par défaut [C#] Serialisation images DB access
    Bonsoir !

    Dans le cadre d'un projet, je souhaiterais sauvegarder des images en DB (Access).

    Voici ma technique actuelle, mais visiblement il y a quelque chose de faux car à la fin, ça ne passe pas :

    1. Je lis le fichier image sous forme de StreamReader
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StreamReader streamReader = new StreamReader(new FileStream("image.jpg", FileMode.Open, FileAccess.Read));
    2. Je le serialise avec une méthode ToBytes (testée dans le cas de sauvegarde d'objets en DB) et sauve le Byte[] en retour dans une row d'une DataTable ayant la même structure que la table dans laquelle j'aimerais sauvegarder l'image (le where 1=0 étant une condition impossible afin d'automatiquement obtenir la structure de la table de destination). Tous les champs requis sont remplis, mais ne sont pas repris ici pour raison de place.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    String query = "SELECT * FROM movies WHERE 1=0";
    DataTable dataTable = ADO.LoadData(query);
    DataRow row = dataTable.NewRow();
    row["picture"]   = Serialization.ToBytes(streamReader.Read());
    dataTable.Rows.Add(row);
    Contenu de la méthode ToBytes() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public static byte[] ToBytes(object obj)
    {
    	MemoryStream ms = new MemoryStream();
    	BinaryFormatter b = new BinaryFormatter();
    	b.Serialize(ms, obj);
     
    	byte[] bytes = ms.GetBuffer();
    	ms.Close();
     
    	return bytes;
    }
    3. Je sauvegarde ensuite le contenu de cette DataTable en DB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ADO.UpdateDataTable(dataTable, query);
    contenu de la méthode UpdateDataTable() :
    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
     
    public static void UpdateDataTable(DataTable dataTable, String query)
    {
    	try
    	{
    		OleDbConnection connection = new OleDbConnection(connectionString);
    		connection.Open();
     
    		OleDbDataAdapter adapter = new OleDbDataAdapter();
    		adapter.SelectCommand = new OleDbCommand(query, connection);
    		OleDbCommandBuilder cb = new OleDbCommandBuilder(adapter);
    		adapter.Update(dataTable);
    		connection.Close();
    	}
    	catch (OleDbException e)
    	{
    		throw new ApplicationException(e.Message);
    	}
    }
    Suite à cela, il se produit une exception "Erreur dans la clause INSERT INTO". J'ai utilisé cette technique ici car au boulot, cela fonctionne parfaitement dans le cas de la séralisation d'un objet en DB. J'ai donc essayé d'extrapoler dans le cas d'un fichier image, mais on dirait qu'il y a un twist quelque part...

    Voilà, ma question et donc la suivante : que dois-je corriger dans ma technique pour que cela fonctionne ? Je suis également preneur d'éventuels conseils d'optimisation (par exemple, est-on obligé de passer par une DataTable pour sérialiser cette image ? Ne peut-on pas directement la sauvegarder d'une manière plus simple ?

    Un grand merci d'avance !

    A bientot ,

    Tips

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 110
    Par défaut
    Je ne suis pas un expert en serialisation, mais pourquoi vouloir serialiser un fichier image qui n'est en fait qu'un flux de données brutes ne contenant aucune expression structurante ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 111
    Par défaut
    Mon but est simplement de sauvegarder mon image en DB, avec ou sans sérialisation. Après y avoir encore réfléchi, je me suis dit que mon StreamReader contenait surement des bytes, et donc déjà la conversion avec la méthode ToBytes() ne serait pas utile. Quand à l'intérêt de l'utilisation de la sérialisation ici, j'en doute également...

    J'effectuerai d'autres tests encore, mais cela me serait d'une grande utilité si on pouvait me dire (même grosso modo) quel serait le principe à appilquer pour sauver une image en base. J'imagine que je peux déjà oublier l'instruction "INSERT INTO"... ça serait trop long. Donc, passer par un DataTable, et ensuite ?

    A bientot

  4. #4
    Membre expérimenté
    Avatar de sam_XIII
    Profil pro
    Inscrit en
    Août 2003
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 221
    Par défaut
    Voici une facon de faire, mais moi je passe par un "INSERT INTO"

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    // sauver une image dans une db access
     
    // contexte :
    // on a une db access a la racine le l'applic (madb.mdb)
    // la table est cree ainsi : 
    //CREATE TABLE MesImages (id COUNTER PRIMARY KEY, pic IMAGE);
    // le nom de la table qu'on va utiliser est "MesImages" , elle est composée //d'un champ id( numéro auto)
    // et d'un champ pic (Objet OLE)
     
                try
                {
                    //1.) recuperer l'image d'un picturebox
                    Image img = pictureBox1.Image;
     
                    //2.) transfomer l'image en byte[]
                    MemoryStream mstImage = new MemoryStream();
                    img.Save(mstImage, System.Drawing.Imaging.ImageFormat.Jpeg);
                    byte[] bytImage = mstImage.GetBuffer();
     
                    //3.) ouvrir une conexion a la db
                    string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Application.StartupPath + @"\madb.mdb" + ";";
     
                    OleDbConnection oConn = new OleDbConnection(connString);
                    oConn.Open();
     
                    //4.) créer la requete
                    string request = "INSERT INTO MesImages (pic) VALUES (@img)";
     
                    OleDbCommand oComm = new OleDbCommand(request, oConn);
     
                    // parametre pour l'image
                    OleDbParameter param = new OleDbParameter("img", OleDbType.VarBinary);
                    param.Value = bytImage;
     
                    oComm.Parameters.Add(param);
     
     
                    //5.) executer la requete
                    oComm.ExecuteNonQuery();
     
                    // fermer la connexion
                    oConn.Close();
     
                    MessageBox.Show("Insertion Ok");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message+"\n\n"+ex.StackTrace, "erreur");
                }
    et pour charger une image d'une db access :

    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
    33
    34
    35
    36
    37
    38
    39
    40
     
    // load une image d'une db
                try
                {
                    //1.) ouvrir une conexion a la db
                    string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Application.StartupPath + @"\madb.mdb" + ";";
     
                    OleDbConnection oConn = new OleDbConnection(connString);
                    oConn.Open();
     
                    //2.) créer la requete
                    string request = "SELECT * FROM MesImages";
     
                    OleDbCommand oComm = new OleDbCommand(request, oConn);
     
                    OleDbDataReader oDr = oComm.ExecuteReader();
     
                    // on lit et on affichera la derniere image
                    while (oDr.Read())
                    {
                        //3.) récupère l'image sous forme de byte[]
                        byte[] bytimg = (byte[])oDr["pic"];
                        Console.WriteLine("taille du byte [] = " + bytimg.Length);
     
                        //4.) transformer le byte[] en image
                        MemoryStream mstImage = new MemoryStream(bytimg);
                        Image img = Image.FromStream(mstImage);
                        pictureBox1.Image = img;
                    }
     
     
                    //5.) fermer la connexion
                    oConn.Close();
     
                    MessageBox.Show("load Ok");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message + "\n\n" + ex.StackTrace, "erreur");
                }
    J'espere que ces bouts de code t'aideron

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 111
    Par défaut
    Ah super je sens que ça marchera bien ça

    Je fais l'essai et je te dis quoi !

    Un grand merci

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 111
    Par défaut
    J'ai fait le test, la partie sauvegarde fonctionne (en tout cas il n'y a pas d'erreur, je n'ai pas encore pu le vérifier en chargeant l'image).

    En effet, il se produit une erreur à l'avant dernière instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Image picture = Image.FromStream(memoryStream);
     
    ArgumentException : parameter is not valid
    C'est bizarre car le type d'argument passé est compatible, ça compile sans problème. C'est au moment de l'exécution que l'erreur se produit. Une idée de solution ?

    Merci

Discussions similaires

  1. Image dans Access
    Par morgantip dans le forum IHM
    Réponses: 27
    Dernier message: 13/12/2007, 06h10
  2. ;-) Insertion image sous access
    Par L'Oracle dans le forum Access
    Réponses: 18
    Dernier message: 06/04/2006, 17h50
  3. envoyer des images avec access
    Par dan664 dans le forum Access
    Réponses: 6
    Dernier message: 13/10/2005, 21h16
  4. [Serialisation]Image et sérialisation
    Par Spoutnik dans le forum Général Java
    Réponses: 3
    Dernier message: 03/08/2005, 15h34

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