Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C# und .NET ::  Blob-Bild aus MySQL-DB laden bzw. speichern     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Wolkenflieger
Unregistrierter




Beitrag Wolkenflieger Unregistrierter 14:12:10 02.09.2010   Titel:   Blob-Bild aus MySQL-DB laden bzw. speichern            Zitieren

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:

Code:
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
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
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();
Code:
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
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();
Code:
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
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!!!
Wolkenflieger
Unregistrierter




Beitrag Wolkenflieger Unregistrierter 14:30:44 02.09.2010   Titel:              Zitieren

Ich meine natürlich in einer Picture-Box anzeigen!
Unix-Tom
Moderator

Benutzerprofil
Anmeldungsdatum: 18.07.2000
Beiträge: 10398
Beitrag Unix-Tom Moderator 15:21:41 02.09.2010   Titel:              Zitieren

Und wo kommt der Fehler?

Welche Zeile?

Kommt eine Exeption oder ein Compilerfehler.

_________________
Moderator für MFC, Linux, C# - NET und Datenbanken
Wolkenflieger
Unregistrierter




Beitrag Wolkenflieger Unregistrierter 15:48:45 02.09.2010   Titel:              Zitieren

Ich habe den Code nun etwas geändert, die Fehlermeldung ist aber nach wie vor die selbe:

Code:
MemoryStream stream = new MemoryStream(myData);
pictureBox1.Image = Image.FromStream(stream);
Code:
MemoryStream stream = new MemoryStream(myData);
pictureBox1.Image = Image.FromStream(stream);
Code:
MemoryStream stream = new MemoryStream(myData);
pictureBox1.Image = Image.FromStream(stream);


Sie erscheint, wenn die Zeile mit der pictureBox1 ausgeführt werden soll (Exception).
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 7463
Beitrag Dravere Moderator 16:20:20 02.09.2010   Titel:              Zitieren

Und wie wird das Bild abgespeichert? In welchem Format?

Grüssli

_________________
Danke für die Hilfe, Antwort oder Meinung!
C++: Std-Lib Referenz
C# .Net: MSDN kennt die Antwort
loki1985
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.01.2004
Beiträge: 917
Beitrag loki1985 Mitglied 16:35:22 02.09.2010   Titel:              Zitieren

wow, und immer noch fehlt die fehlermeldung....

_________________
syntax-highlighting ist für schwächlinge! echte Klingonen programmieren in notepad, und wenn sie eine IDE sehen jagen und töten sie diese.
Wolkenflieger
Unregistrierter




Beitrag Wolkenflieger Unregistrierter 21:47:10 02.09.2010   Titel:              Zitieren

Die Fehlermeldung lautet Ungültiger Parameter

Die Bilder wurden ursprünglich über Access (OLE-Objekt) in die MySQL-DB gespeichert. (blob)
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 7463
Beitrag Dravere Moderator 23:03:09 02.09.2010   Titel:              Zitieren

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

_________________
Danke für die Hilfe, Antwort oder Meinung!
C++: Std-Lib Referenz
C# .Net: MSDN kennt die Antwort
Wolkenflieger
Unregistrierter




Beitrag Wolkenflieger Unregistrierter 08:28:53 03.09.2010   Titel:              Zitieren

Die Bilder wurden als jpeg gespeichert.

Im Byte-Array bekomme ich Sachen wie 301768.

Hoffe das hilft irgendwie weiter?!
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 7463
Beitrag Dravere Moderator 10:56:47 03.09.2010   Titel:              Zitieren

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

_________________
Danke für die Hilfe, Antwort oder Meinung!
C++: Std-Lib Referenz
C# .Net: MSDN kennt die Antwort
Wolkenflieger
Unregistrierter




Beitrag Wolkenflieger Unregistrierter 14:16:41 09.09.2010   Titel:              Zitieren

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:
Code:
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
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
//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));
        }
Code:
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
//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));
}
Code:
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
//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:
Code:
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
                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();
Code:
1
2
3
4
5
6
7
8
9
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();
Code:
1
2
3
4
5
6
7
8
9
                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.
Wolkenflieger
Unregistrierter




Beitrag Wolkenflieger Unregistrierter 09:34:51 10.09.2010   Titel:              Zitieren

Bin langsam echt am Verzweifeln und probiere daher einiges aus ...

Hab nun eine neue Tabelle in MySQL erstellt:
ID -> VARCHAR(50)
Bild -> LONGBLOB

Und versuche so überhaupt mal ein Bild in der DB zu speichern:
Code:
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
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();
Code:
1
2
3
4
5
6
7
8
9
10
11
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();
Code:
1
2
3
4
5
6
7
8
9
10
11
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!!!
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 7463
Beitrag Dravere Moderator 11:30:16 10.09.2010   Titel:              Zitieren

Probier mal statt "@image", bzw. "@Bild", eher "?image", bzw. "?Bild", zu verwenden.
Zudem, wenn ich mich recht erinnere, unterstützt MySqlCommand.Parameters direkt ein AddWithValue, wo man als zweiten Parameter ein Byte-Array übergeben kann.

Grüssli

_________________
Danke für die Hilfe, Antwort oder Meinung!
C++: Std-Lib Referenz
C# .Net: MSDN kennt die Antwort
witte
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.01.2008
Beiträge: 1295
Beitrag witte Mitglied 11:34:05 10.09.2010   Titel:              Zitieren

http://forums.mysql.com/read.php?70,121236,121537#msg-121537
Wolkenflieger
Unregistrierter




Beitrag Wolkenflieger Unregistrierter 12:53:50 10.09.2010   Titel:              Zitieren

Zitat:

Probier mal statt "@image", bzw. "@Bild", eher "?image", bzw. "?Bild", zu verwenden.


Genial!!! Es funktioniert!
Nochmals vielen Dank für Eure Hilfe!
C/C++ Forum :: C# und .NET ::  Blob-Bild aus MySQL-DB laden bzw. speichern   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.