Blob-Bild aus MySQL-DB laden bzw. speichern
-
Hallo,
in unserer MySQL-DB sind die Bilder zu Produkten als Blob gespeichert.
Nun würde ich gerne mit C# darauf zugreifen, um sie in einer Textbox anzeigen zu lassen - bzw. später auch neue dazu speichern.
Hier mal der Code zum Anzeigen, leider bekomme ich immer eine Fehlermeldung mit Ungültier Parameter:
MySqlCommand cmd = new MySqlCommand("SELECT Bild FROM tblartikel_bild WHERE ArtikelID = '800-437'", conn); DataSet ds = new DataSet(); MySqlDataAdapter da = new MySqlDataAdapter(cmd); da.Fill(ds, "tblartikel_bild"); System.Data.DataTable dt = ds.Tables["tblartikel_bild"]; for (int i = 0; i < dt.Rows.Count; i++) { Byte[] blobData = new Byte[0]; //blobData = (Byte[])ds.Tables["tblartikel_bild"].Rows[i]["blob"]; blobData = (Byte[])dt.Rows[i]["blob"]; MemoryStream msStream = new MemoryStream(blobData); pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; Bitmap bt = new Bitmap(msStream); pictureBox1.Image = bt; msStream.Close(); } conn.Close();
Kann mir bitte jemand helfen bzw. sagen was ich falsch mache?!
Vielen DANK!!!
-
Ich meine natürlich in einer Picture-Box anzeigen!
-
Und wo kommt der Fehler?
Welche Zeile?
Kommt eine Exeption oder ein Compilerfehler.
-
Ich habe den Code nun etwas geändert, die Fehlermeldung ist aber nach wie vor die selbe:
MemoryStream stream = new MemoryStream(myData); pictureBox1.Image = Image.FromStream(stream);
Sie erscheint, wenn die Zeile mit der pictureBox1 ausgeführt werden soll (Exception).
-
Und wie wird das Bild abgespeichert? In welchem Format?
Grüssli
-
wow, und immer noch fehlt die fehlermeldung....
-
Die Fehlermeldung lautet Ungültiger Parameter
Die Bilder wurden ursprünglich über Access (OLE-Objekt) in die MySQL-DB gespeichert. (blob)
-
Wolkenflieger schrieb:
Die Bilder wurden ursprünglich über Access (OLE-Objekt) in die MySQL-DB gespeichert. (blob)
Das sagt uns überhaupt gar nichts. Blob bedeutet einfach nur eine Datenmenge. Blob kann alles sein, was in Bytes repräsentiert werden kann ... also wirklich alles. Ich frage aber, in welchem Format das Bild denn abgespeichert wurde? Bitmap? Jpeg? Png? Gif? Tiff? Oder einfach eine Reihe von ARGB Werten? Oder sonst was?
Hast du auch schon mal geprüft, ob überhaupt was sinnvolles in diesem Byte-Array drin steht?
Grüssli
-
Die Bilder wurden als jpeg gespeichert.
Im Byte-Array bekomme ich Sachen wie 301768.
Hoffe das hilft irgendwie weiter?!
-
Wolkenflieger schrieb:
Die Bilder wurden als jpeg gespeichert.
Direkt als Jpeg-Files? Hast du schon mal probiert, statt das Jpeg per Bitmap und PictureBox anzuzeigen, es einfach wieder in ein File zu speichern und dann über dein Lieblings-Bildbetrachtungsprogramm zu öffnen? Einfach um mal zu prüfen, ob der Inhalt des Byte-Array überhaupt korrekt ist
Grüssli
-
Leider komme ich immer noch nicht so recht vorwärts ...
Habe nun folgendes versucht - indem ich zunächst versuche das Bild in der DB zu speichern:
//photobox is the picturebox holding picture private byte[] ImageToStream(Image photo) { Bitmap image = new Bitmap(photo); MemoryStream stream = new MemoryStream(); image.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp); return stream.ToArray(); } private void StoreData(byte[] content) { conn.Open(); if (conn.State.Equals(ConnectionState.Closed)) conn.Open(); try { MySqlCommand cmdInsert = new MySqlCommand("Insert into tblbild (id, bild) values('150',@image)", conn); MySqlParameter imageParameter = cmdInsert.Parameters.Add("@image", SqlDbType.Binary); imageParameter.Value = content; imageParameter.Size = content.Length; cmdInsert.ExecuteNonQuery(); MessageBox.Show("Speichern erfolgreich"); } catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); MessageBox.Show(ex.StackTrace.ToString()); } finally { conn.Close(); } } private void btnSpeichern_Click(object sender, EventArgs e) { StoreData(ImageToStream(pictureBox2.Image)); }
Und dann versuche genau das Bild zu laden:
conn.Open(); MySqlDataAdapter da = new MySqlDataAdapter("select bild from tblbild where id='150'", conn); DataSet ds = new DataSet(); da.Fill(ds); conn.Close(); byte[] content = (byte[])ds.Tables[0].Rows[0].ItemArray[0]; MemoryStream stream = new MemoryStream(content); pictureBox1.Image = Image.FromStream(stream); conn.Close();
Es erscheint zwar die Meldung "Speichern erfolgreich" - die ID wird auch in der Tabelle angelegt, aber es werden keine Daten (Bild) dazu gespeichert, folglich kann ja auch nichts angezeigt werden.
Hoffe Ihr könnt mir weiter helfen - in die PictureBox2 habe ich ein Bild geladen.
-
Bin langsam echt am Verzweifeln und probiere daher einiges aus ...
Hab nun eine neue Tabelle in MySQL erstellt:
ID -> VARCHAR(50)
Bild -> LONGBLOBUnd versuche so überhaupt mal ein Bild in der DB zu speichern:
MySqlCommand cmd = new MySqlCommand("INSERT INTO tblbild (ID,Bild) VALUES ('150',@Bild)", conn); String strPath = @"D:\5.jpg"; FileStream fs = new FileStream(strPath, FileMode.Open, FileAccess.Read); Byte[] bytBlobData = new byte[fs.Length]; fs.Read(bytBlobData, 0, bytBlobData.Length); fs.Close(); MySqlParameter prm = new MySqlParameter("@Bild", MySqlDbType.VarBinary, bytBlobData.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, bytBlobData); cmd.Parameters.Add(prm); conn.Open(); cmd.ExecuteNonQuery(); conn.Close();
Kann mir bitte jemand helfen und sagen, warum für das Bild nichts gespeichert wird?? Die Tabelle bleibt da gundsätzlich leer ...
DANKE im Voraus!!!
-
Probier mal statt
"@image"
, bzw."@Bild"
, eher"?image"
, bzw."?Bild"
, zu verwenden.
Zudem, wenn ich mich recht erinnere, unterstütztMySqlCommand.Parameters
direkt einAddWithValue
, wo man als zweiten Parameter ein Byte-Array übergeben kann.Grüssli
-
-
Probier mal statt "@image", bzw. "@Bild", eher "?image", bzw. "?Bild", zu verwenden.
Genial!!! Es funktioniert!
Nochmals vielen Dank für Eure Hilfe!