Bild von Acces-Datenbank in picturebox anzeigen..!



  • 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 😉



  • Danke geeky für deine Antwort..!
    Das erklärt einiges..auch, dass der gleiche Code aber mit einer SQL-Datenbank und natürlich mit einem SQL-Data-Adapter ohne Probleme funtkioniert, weil da werden die bilder als binary-Daten gespeichert.

    geeky schrieb:

    Du müsstest eine Möglichkeit finden das Bild aus dem Ole-Objekt irgendwie herauszubekommen 😉

    Hättest du vielleicht ne Idee wie ich das machen kann..?





  • Danke, lese grad ein ähnlichen Artikel, nämlich den..:
    http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/f716de15-b9f2-49a0-8ae8-624a190454de
    Verstehe aber nicht die folgende Zeile..:

    ms.Write(byPicture, 78, byPicture.Length - 78);
    

    Was ist mit der Zahl "78", was meint er mit offset 78 bits..??

    Sonst habe mir überlegt es so zu machen (ist ja Copy-Paste von der Seite)..:

    oleDbConnection1.Open();
                OleDbCommand cmd = new OleDbCommand("SELECT bild FROM my_pic WHERE ID=1",oleDbConnection1);
    
                Byte[] byPicture;
                byPicture = (Byte[])cmd.ExecuteScalar();
                oleDbConnection1.Close();
                MemoryStream ms = new MemoryStream();
                Bitmap bm;
                ms.Write(byPicture, 78, byPicture.Length - 78);
                bm = new Bitmap(ms);
                pictureBox1.Image = bm;
    

    Aber leider bekomme ich eine Exception wieder mal.
    Diesmal bekommt

    bm = new Bitmap(ms);
    

    einen ungültigen Parameter, nämlich 'null'.



  • Scheinbar konnte man ab Byte 78 das Original-Bild rausfischen.
    Schaut man sich die Datei im Hex-Editor an, würde bei deiner Datei der Offset 213 passen - Sowas sieht mir aber eher nach Fuschlösung aus ^^



  • Hast recht mit 213 geht es..!
    Aber verstehe nicht wie du die Zahl 213 gefunden hast..!
    Du meinst man sollte das Bild mit einem Hex-Editor öffnen, aber dann wo muss ich hinschauen..?

    Meine nächste Frage wäre dann, ob ich mit diesem Code nur dieses bild öffnen kann oder irgendein Bild..? (Denke mal diese offset-zahl ist ja nicht bei allen Bildern gleich, oder täusche ich mich..?)
    Das meisnt du doch mit Fuschlösung..?



  • Bonafide schrieb:

    (Denke mal diese offset-zahl ist ja nicht bei allen Bildern gleich, oder täusche ich mich..?)
    Das meisnt du doch mit Fuschlösung..?

    Jo, ich vermute mal stark das diese Offset-Zahl nicht fest auf 213 sein wird.

    Wenn man bei byPicture einfach mal als "daten.dat" oder so abspeichert und im Hex-Editor öffnet, fällt einem sofort "EXIF" ins Auge, bei EXIF wieder denkt man an Jpeg. Jpeg-Dateien bestehen aus "Markern".
    "0xFF 0xD8" ist der "Start Of Image"-Marker, der befindet sich in der Datei genau nach 213 Bytes.



  • Achso verstehe..!
    Und deine Vermutung ist richtig. Habe es mit anderen jpeg getestet und ich muss jedesmal diese offset-zahl rausfinden und ändern, damit das Bild angezeigt wird.

    Und das hilft mir natürlich nicht, da ich jedesmal anderes bild von der db laden will.

    Was ist aber wenn ich jedesmal, wenn ich ein bild lade, diese offset-zahl rausfinde, bevor diese Zeile natürlich

    ms.Write(byPicture, 203, byPicture.Length - 203);
    

    und dann den rausgefundenen Wert weitergebe.

    Geht sowas..?
    Und wenn ja wie kompliziert ist es, weil wie du schon bemerkt hast, bin ich noch relativer anfäger..!


Anmelden zum Antworten