Bild von Acces-Datenbank in picturebox anzeigen..!
-
Hallo,
Habe ein problem.
Habe eine Datenbank in Acces die auch bilder speichert, und zwar als "OLE-Object".
Wie kann ich denn ein Bild aus der Datenbank laden und anzeigen lassen..?
Ich weiss ich muss das gespeicherte Bild binär lesen und dann zum Bild "umwandeln", aber ich weiss nicht wie ich es machen soll..!oleDbConnection1.Open(); // bild ist die spalte, wo die bilder gespeichert werden OleDbCommand cmd = new OleDbCommand("SELECT bild FROM test_tab where test_2_int=3", oleDbConnection1); OleDbDataAdapter dp = new OleDbDataAdapter(cmd); OleDbDataReader myReader; myReader = select_com.ExecuteReader(); while (myReader.Read()) { //Was muss ich hier schreiben, damit ich mein bild auslesen kann..? }
Bitte um Hilfe..!
-
Naja du liest es in ein byte-Array ein und wandelst es dann in ein Image um.
-
Firefighter schrieb:
Naja du liest es in ein byte-Array ein und wandelst es dann in ein Image um.
Das ist mir schon klar, die Frage ist nur wie..?
Der nachfolgende Code funktioniert für ne SQL-Datenbank (selber getestet), eine sql-connection wird benötigt..SqlConnection connect = new SqlConnection ("Server=.;database=Videothek;integrated security=true"); SqlCommand command = new SqlCommand ("SELECT bild FROM test_tab where test_2_int=3", connect); SqlDataAdapter dp = new SqlDataAdapter(command); DataSet ds = new DataSet("MyImages"); byte[] MyData = new byte[0]; dp.Fill(ds, "MyImages"); DataRow myRow; myRow = ds.Tables["MyImages"].Rows[0]; MyData = (byte[])myRow["bild"]; MemoryStream stream = new MemoryStream(MyData); pictureBox1.Image = Image.FromStream(stream);
Ich hingegen habe eine Acces-Datenbank, benötige eine OleDbConnection.
Die Frage ist, kann ich diesen Code so ändern, dass es auch mit einer OleDbConnection funktioniert..?// ...oleDbConnection1 wurde schon erstellt oleDbConnection1.Open(); OleDbCommand cmd = new OleDbCommand("SELECT bild FROM test_tab where test_2_int=3", oleDbConnection1); OleDbDataAdapter dp = new OleDbDataAdapter(cmd); DataSet ds = new DataSet("MyImages"); byte[] MyData = new byte[0]; dp.Fill(ds, "MyImages"); DataRow myRow; myRow = ds.Tables["MyImages"].Rows[0]; MyData = (byte[])myRow["bild"]; MemoryStream stream = new MemoryStream(MyData); pictureBox1.Image = Image.FromStream(stream); oleDbConnection1.Close();
Leider funktioniert dieser Code aber nicht.
Fehler..: Bei Zeile "pictureBox1.Image = Image.FromStream(stream);" kommt "ArgumentException wurde nicht behandelt - Ungültiger Parameter".
Das heisst die Umwandlung von Byte-Array zu Image war nicht erfolgreich.
Wieso..?
-
Bonafide schrieb:
Firefighter schrieb:
Naja du liest es in ein byte-Array ein und wandelst es dann in ein Image um.
Das ist mir schon klar, die Frage ist nur wie..?
Byte-Array -> MemoryStrem -> Image::FromStream(MemoryStream)
-
mogel schrieb:
Bonafide schrieb:
Firefighter schrieb:
Naja du liest es in ein byte-Array ein und wandelst es dann in ein Image um.
Das ist mir schon klar, die Frage ist nur wie..?
Byte-Array -> MemoryStrem -> Image::FromStream(MemoryStream)
Das passiert bei meinem Code ja auch, aber es funktioniert nicht, zumindenstens nicht mit einer OleDbConnection, mit SqlConnection geht es wunderbar..!
Die Frage ist wo ist der Fehler in diesem Code..?
// ...oleDbConnection1 wurde schon erstellt oleDbConnection1.Open(); OleDbCommand cmd = new OleDbCommand("SELECT bild FROM test_tab where test_2_int=3", oleDbConnection1); OleDbDataAdapter dp = new OleDbDataAdapter(cmd); DataSet ds = new DataSet("MyImages"); byte[] MyData = new byte[0]; dp.Fill(ds, "MyImages"); DataRow myRow; myRow = ds.Tables["MyImages"].Rows[0]; MyData = (byte[])myRow["bild"]; MemoryStream stream = new MemoryStream(MyData); pictureBox1.Image = Image.FromStream(stream); oleDbConnection1.Close();
-
Hast du schonmal Debugged und geschaut was denn dabei rauskommt?
-
Firefighter schrieb:
Hast du schonmal Debugged und geschaut was denn dabei rauskommt?
Ja, da kommt "ArgumentException wurde nicht behandelt - Ungültiger Parameter" für die Zeile "pictureBox1.Image = Image.FromStream(stream);".
-
Nein das meine ich nicht. Mit debuggen meine ich, das du mal schauen sollst was hier:
MyData = (byte[])myRow["bild"];
wirklich in "MyData" drinne steht.
-
Ah so, und wie kann ich das sehen..?
-
Schreib das Byte-Array z.B. via File.WriteAllBytes() in eine Datei und guck dir die dann an
-
kein normaler mensch schreibt bilddaten in eine datenbank!!!
merke: schreibe nur informationen in eine datenbank, wenn du sie nach kriterien/suchbegriffen wiederfinden willst.
-
Ist quatsch.
Seit MSSQL 2008 ist es sogar noch einfacher.
Nennt sich dann Filestream.
Fast jedes große CMS speichert die Bilder in der DB.
-
geeky schrieb:
Schreib das Byte-Array z.B. via File.WriteAllBytes() in eine Datei und guck dir die dann an
Könntest du mir das mal näher erklären..?
Wo soll ich die hinschreiben..?
File.WriteAllBytes() braucht 2 Argumente, eine string und eine byte[].
Das erste soll der pfad zu der Datei sein wo hingeschriebn werden soll und das zweite das byte[].
Aber in was fürne Datei soll ich denn schreiben..? (.dat Datei.?)Muss ich die Datei zuerst erstellt haben..?
Ein nähere erklärung wäre schön..!
-
Puhh du solltest vielleicht mal die Grundlagen angucken eh du mit "komplexen" Datenbankmanagement beginnst.
Aber in was fürne Datei soll ich denn schreiben..? (.dat Datei.?)
Das ist an sich völlig Wurst. Du musst es dir dann nur mal in einem Hex-Editor anschauen. Oder wie gesagt du debuggst. Wie das geht, solltest du dir vielleicht auch mal angucken, das sind wichtige Grundlagen die dir da fehlen.
-
Firefighter schrieb:
Puhh du solltest vielleicht mal die Grundlagen angucken eh du mit "komplexen" Datenbankmanagement beginnst.
Aber in was fürne Datei soll ich denn schreiben..? (.dat Datei.?)
Das ist an sich völlig Wurst. Du musst es dir dann nur mal in einem Hex-Editor anschauen. Oder wie gesagt du debuggst. Wie das geht, solltest du dir vielleicht auch mal angucken, das sind wichtige Grundlagen die dir da fehlen.
Grundlagen...ja da hast du vielleicht recht...aber ab wann gehört denn das auslesen einer Datenbnak zum "komplexen" Datenbankmanagement..???
Zurück zum Thema, habe mit File.WriteAllBytes() die datei geschrieben, aber die ist 0 Bytes, also es wurde einfach nur ne Datei erstellt die Leer ist.
-
aber ab wann gehört denn das auslesen einer Datenbnak zum "komplexen" Datenbankmanagement..???
Naja man sollte schon wissen wie man eine Binärdatei schreibt oder zumindest wie man mit seiner IDE umgeht,Stichwort:Debugging, ehe man sich mit solchen dingen Beschäftigt.
Zurück zum Thema, habe mit File.WriteAllBytes() die datei geschrieben, aber die ist 0 Bytes, also es wurde einfach nur ne Datei erstellt die Leer ist.
Dann erhälst du ganz klar korrupten Daten aus deiner DB.
-
Ja, aber das kann auch nicht so wahr sein, weil ich in Acces die Bilder sehen kann..!
-
Ich kann mich nur wiederholen. Debugge an der Stelle welche ich dir schonmal gepostet habe und schau in das Array rein, ob du da überhaupt was valides bekommst.
-
Weil ich nicht weiterkomme, habe ich mal die projektmappe upgeloaded...
...vielleicht kann sich jemand der lust hat das angucken..!
Wie gesagt, habe das oben genannte problem mit dem Lesen eines Bildes von einer Acces-Datenbank.
Hier das Projekt...
Klick
-
Ah, ich sehe das Problem
Access scheint die Bilder in der Tabelle nicht direkt als Bitmap, jpeg oder sowas zu speichern sondern noch ein Ole-Objekt drumherum zu packen.
Damit kann Image.FromStream() nichts anfangen.
Du müsstest eine Möglichkeit finden das Bild aus dem Ole-Objekt irgendwie herauszubekommen