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.