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

ASP.NET Discussion :

Ranger une image Byte à partir d'un reader possible? [Débutant]


Sujet :

ASP.NET

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Bonjour à tous,

    Je voudrais savoir s'il est possible de stocker une image, qui se trouve à l'origine dans une base de données Postgresql sous la forme d'un byte, dans une variable à partir d'un NpgsqlDataReader ?
    En gros le code ressemblerait à ça (bien sur ça ne marche pas):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    using (NpgsqlDataReader reader = command.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                MyDataList.Add(new MyData
                                {
                                    Id = reader.GetInt32(0),
                                    image = reader.GetByte(7), // C'est ici ou je veux ranger mon image
                                    defaultCode = reader.GetString(9),
                                    nameTemplate = reader.GetString(10)
                                });
                            }
                        }
    J'ai trouvé des tutoriel sur le net ou beaucoup de monde utilise des Byte[] mais à chaque fois ce sont des fonctions qu'il faut appelé indépendamment alors que moi je dois générer toutes les données en même temps. L'affichage se fera dans un programme tiers (Intuiface).

    Je vous remercie pour l'aide apportée,
    Alexandre.



    [EDIT 1]
    Bonjour à tous,

    J'ai tapé ce code mais je reçois une exception de type 'System.ArgumentException' avec en supplément "Informations supplémentaires : Le paramètre n'est pas valide." Voici le code :

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
            public void run(string productName)
            {
                using (NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=openpg;Password=openpgpwd;Database=test;"))
                {
                    try
                    {
                        conn.Open();
     
                        using (NpgsqlCommand command = new NpgsqlCommand("Select pr.id, pr.default_code, pr.name_template, tpl.list_price, pr.image_medium FROM product_product as pr inner join product_template as tpl on tpl.id = pr.product_tmpl_id WHERE pr.default_code = :productName;", conn))
                        {
                            command.Parameters.AddWithValue(":productName", productName);
                            //command.Parameters.Add(new NpgsqlParameter("productName", NpgsqlDbType.Text));
                            //command.Parameters[0].Value = productName;
                            try
                            {
                                using (NpgsqlDataReader reader = command.ExecuteReader())
                                {
                                    try
                                    {
                                        while (reader.Read())
                                        {
                                            if (reader[4] != null)
                                            {
                                                using (Stream productImageStream = new System.IO.MemoryStream((Byte[])reader[4]))
                                                {
                                                    try
                                                    {
                                                        MyDataList.Add(new MyData
                                                        {
                                                            Id = reader[0].ToString(),
                                                            defaultCode = reader[1].ToString(),
                                                            nameTemplate = reader[2].ToString(),
                                                            listPrice = reader[3].ToString(),
                                                            image = Image.FromStream(productImageStream)
                                                        });
                                                        Console.WriteLine(reader[0]);
                                                        Console.WriteLine(reader[1]);
                                                        Console.WriteLine(reader[2]);
                                                        Console.WriteLine(reader[3]);
                                                    }
                                                    catch
                                                    {
                                                        throw;
                                                    }
                                                }
                                            }
                                            else
                                                MyDataList.Add(new MyData
                                                {
                                                    Id = reader[0].ToString(),
                                                    defaultCode = reader[1].ToString(),
                                                    nameTemplate = reader[2].ToString(),
                                                    listPrice = reader[3].ToString(),
                                                    image = null
                                                });
                                        }
                                    }
                                    catch
                                    {
                                        throw;
                                    }
                                    conn.Close();
                                }
                            }
                            catch
                            {
                                throw;
                            }
                        }
                    }
                    catch
                    {
                        throw;
                    }
     
                }                    
                MyData data = new MyData();
                Console.Write("{0} \t", MyDataList.Count);
     
                for (int i = 0; i < MyDataList.Count; i++)
                {
                    data = MyDataList[i];
                    Console.Write("{0} \t", data.ToString());
                }
                Console.ReadKey(true);
     
            }
    La requête SQL fonctionne, je l'ai essayé dans pgAdmin et cela me retourne bien les données que je recherche. Mon problème concerne toujours la récupération de l'image et la je commence vraiment à bien coincer.
    Les variables id, nameTemplate, etc sont dans une classe à part, MyDataList est un ObservableCollection.

    Si vous avez besoin d'autres information n'hésitez pas à le dire je vous les fournirai.

    Merci par avance pour l'aide apportée,
    Alexandre.



    [EDIT 2]
    Bonjour,

    J'ai modifié un peu mon code pour ne traiter que l'image :

    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
     
    using (NpgsqlCommand command = new NpgsqlCommand("SELECT image_medium FROM product_product WHERE default_code = :productName;", conn))
                        {
                            command.Parameters.AddWithValue(":productName", productName);
                            try
                            {
                                Byte[] productImageByte = (Byte[])command.ExecuteScalar();
                                if (productImageByte != null)
                                {
                                    using (MemoryStream productImageStream = new MemoryStream(productImageByte))
                                    {
                                        Console.WriteLine(productImageStream.ToString());
                                        Console.WriteLine("Voici ce que  contient reader[0] : " + productImageStream);
     
                                        try
                                        {
                                            MyDataList.Add(new MyData
                                            {
                                                image = Image.FromStream(productImageStream)
                                            });
                                        }
    Il semblerait que le paramètre non valide soit 'productImageStream', d'après le site de microsoft Image.FromStream prends en paramètre une image. Pourtant sur plusieurs site c'est bien de cette façon la que l'on récupère une image... Est ce que ça aurait changé entre temps? Comment puis-je transformer mon productImageByte en une image?

    Je vous remercie par avance pour votre aide,
    Alexandre.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Quel est le type de la colonne image_medium dans la DB ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Bonjour et merci d'avoir répondu,

    Le type d'image_medium est bytea.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Peux-tu donner les détails de l'erreur ? Message, InnerException et StackTrace

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    La fenêtre d'erreur me donne ca :

    Une exception non gérée du type 'System.ArgumentException' s'est produite dans consoleTest2.exe
    Informations supplémentaires : Le paramètre n'est pas valide.

    Et le paramètre non valide est le 'productImageStream' de "image = Image.FromStream(productImageStream)" car si je remplace cette ligne par un Console.Writeline par exemple je ne génère plus d'erreur.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par yazmat Voir le message
    Une exception non gérée du type 'System.ArgumentException' s'est produite dans consoleTest2.exe
    Informations supplémentaires : Le paramètre n'est pas valide.
    Ca tu l'avais déjà dit... ce que je te demande c'est le reste des détails de l'exception, notamment la StackTrace (s'il y en a une) et la InnerException avec tous ses détails

    D'autre part, comment l'image a-t-elle été enregistrée dans la DB à l'origine ?

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Je suis désolé, c'est la première fois que j'utilise Visual Studio et lorsque je lance mon démarrer après avoir générer la petite qui s'ouvre sur mon catch ne me donne pas plus d'information que ce que je vous ai dit plus haut.

    La base de donnée postgresql a été installé via Odoo (openERP).

    [EDIT]

    Je pense que vous parliez de ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    catch (Exception e)
                                        {
                                            Console.WriteLine("Error: {0}", e.ToString());
                                            Console.WriteLine("Error: {0}", e.StackTrace);
                                            Console.WriteLine("Error: {0}", e.Message);
                                            Console.WriteLine("Error: {0}", e.GetType().FullName);    
                                        }
    Et voici ce que ça me retourne (sous forme d'une image dsl je pouvais pas copier/coller):
    Nom : Erreur.png
Affichages : 156
Taille : 175,2 Ko

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par yazmat Voir le message
    Je suis désolé, c'est la première fois que j'utilise Visual Studio et lorsque je lance mon démarrer après avoir générer la petite qui s'ouvre sur mon catch ne me donne pas plus d'information que ce que je vous ai dit plus haut.
    Clique sur "View detail" dans la popup d'exception qui apparait (je me rappelle plus comment ça s'appelle en français) :

    Nom : exception_dialog.png
Affichages : 146
Taille : 56,6 Ko

    Citation Envoyé par yazmat Voir le message
    La base de donnée postgresql a été installé via Odoo (openERP).
    C'est pas ça que j'ai demandé... ce que je demande, c'est comment l'image a été insérée dans la table. Parce qu'apparemment elle n'est pas dans un format "normal" comme JPG, BMP ou PNG...

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Dsl mais quand je disais que la base a été installé par Odoo c'est que tout ce qui est dans la base a été généré par Odoo aussi, je n'ai pas rempli la table, tout était déjà rempli, c'est pour cela que je faisais mets essaie dessus.

    Pour ce qui est du view detail voici ce que ca donne :

    Nom : Erreur2.png
Affichages : 145
Taille : 219,8 Ko

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    OK, pas grand chose de concluant là-dedans...
    Est-ce que tu pourrais essayer d'enregistrer les données dans un fichier (avec File.WriteAllBytes("image.bin", productImageByte)) et envoyer le fichier pour que j'y jette un coup d'oeil?

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Voici le fichier "image.bin".

    image.rar

    PS: je ne pouvais pas envoyer le fichier .bin donc je l'ai compressé

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    OK, c'est une image PNG encodée en base64. Vraiment bizarre comme façon de faire
    Donc pour la lire, il faut :
    - lire la chaine base64 à partir du tableau de byte avec Encoding.Default.GetString
    - convertir la chaine base64 en tableau de byte avec Convert.FromBase64String
    - lire l'image à partir du tableau de byte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    byte[] base64Bytes = (byte[])command.ExecuteScalar();
    string base64 = Encoding.Default.GetString(base64Bytes);
    byte[] imageBytes = Convert.FromBase64String(base64);
    using(MemoryStream ms = new MemoryStream(imageBytes)
    {
        Image img = Image.FromStream(ms);
    }

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Je n'ai plus d'erreur sur Visual Studio, donc je pense que l'image se range bien dans ma variable. Maintenant elle ne s'affiche pas dans Intuiface mais je pense que le problème doit venir de celui-ci je ne dois pas faire les choses correctement.

    En tout cas merci beaucoup pour la solution, je n'y aurai jamais pensé, je n'ai jamais vu cette solution sur aucun des forums que j'ai visité et il y en avait pas mal avec cette erreur de 'Paramètre non valide'.

    Merci encore pour le coup de main et bonne journée!
    Alexandre.

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

Discussions similaires

  1. Problème de création d'une image BMP à partir d'un byte[]
    Par Dark_Alex69 dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 28/03/2010, 16h32
  2. reconstitution d'une image a partir d'un tableau de bytes
    Par guian dans le forum Entrée/Sortie
    Réponses: 17
    Dernier message: 04/12/2008, 16h54
  3. Réponses: 1
    Dernier message: 03/11/2008, 15h36
  4. Alimenter une image byte[] à partir d'un String
    Par SheikYerbouti dans le forum AWT/Swing
    Réponses: 18
    Dernier message: 31/10/2006, 07h54
  5. [Image] Comment créer une image à partir d'un fichier
    Par mereyj dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 01/07/2005, 21h48

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