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):
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).
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) }); } }
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 :
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.
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); }
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 :
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?
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) }); }
Je vous remercie par avance pour votre aide,
Alexandre.
Partager