Bild in Datenbank speichern und in PictureBox & DataGridView anzeigen lassen

  • Allgemein

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Bild in Datenbank speichern und in PictureBox & DataGridView anzeigen lassen

    Hi Comm,
    bin schon seit einer Weile auf der Suche nach einer Lösung um Bilddateien in einer MySQL-Datenbank abzuspeichern und diese dann wieder aufzufen.
    Habe mich schon ein bisschen "durchgewälzt" aber noch keine wirkliche Lösung gefunden..
    Das Bild soll sowohl mit meinem Sub

    VB.NET-Quellcode

    1. Sub dgv_füllen()
    2. Try
    3. DGV1.DataSource = Nothing
    4. Dim dt As New DataTable
    5. Dim da As New MySqlDataAdapter("SELECT * FROM `database`.`table` ;", cnn)
    6. da.Fill(dt)
    7. DGV1.DataSource = dt
    8. DGV1.Sort(DGV1.Columns(2), System.ComponentModel.ListSortDirection.Ascending)
    9. Catch : End Try
    10. End Sub

    in dem DataGridView DGV1, als auch in einer Picturebox angezeigt werden können.

    Ich hoffe ihr mit helfen,
    LG
    Merio
    das ist aber in vb2008 Express geschrieben - naja: gedowngraded, aber man hättes auch drin schreiben können.

    Was ein Xammp ist habich k.A.. Eine in .Net geschriebene Client-Anwendung braucht halt einen Verweis auf eine Dll, die den DBProvider in .Net repräsentiert, und dann einen ConnectionString.
    K.A., ob die beiliegende mySql-Dll auch Xammp-MySql spricht.

    Aber das betrifft ja garnet deine Frage.
    Also um ein Bild sowohl in PB als auch im DGV anzuzeigen, brauchts nur eine DataTable mit einer DataColumn mit DataType Byte().
    Dann kann man Databinding verwenden.
    Mehr wollte ich ja garnet vorzeigen.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ich hab es auch schon mit

    VB.NET-Quellcode

    1. Public Function ImageToBase64(ByVal oImage As Image) As String
    2. If oImage IsNot Nothing Then
    3. With New System.Drawing.ImageConverter
    4. ' Image in Byte-Array umwandeln
    5. Dim nBytes() As Byte = CType(.ConvertTo(oImage, GetType(Byte())), Byte())
    6. ' Byte-Array in Base64-codierten String umwandeln
    7. Return (Convert.ToBase64String(nBytes, _
    8. Base64FormattingOptions.InsertLineBreaks))
    9. End With
    10. Else
    11. ' Leerstring zurückgeben
    12. Return ("")
    13. End If
    14. End Function


    und

    VB.NET-Quellcode

    1. Public Function Base64ToImage(ByVal sData As String) As Image
    2. Dim oImage As Image = Nothing
    3. If sData.Length > 0 Then
    4. ' String decodieren und in Byte-Array umwandeln
    5. Dim nBytes() As Byte = Convert.FromBase64String(sData)
    6. If nBytes IsNot Nothing AndAlso nBytes.Length > 0 Then
    7. ' Byte-Array in Image-Objekt umwandeln
    8. With New System.Drawing.ImageConverter
    9. oImage = CType(.ConvertFrom(nBytes), Image)
    10. End With
    11. End If
    12. End If
    13. Return (oImage)
    14. End Function



    versucht, funktioniert weder mit DGV noch mit PB ..
    LG
    Merio
    Ich hab mir das Tut schonmal heruntergeladen und wollte das eigentlich wieder finden, also danke ich Dir. :)
    ABER:
    Mit der Online-Datenbank kann ich keine Datei auswählen, so wie in dem Tut und deswegen ist das leider keine Lösung.
    Ich stelle eine Verbindung mit der Datenbank über die MySQL.Data.dll her und mache dann alles per Code, auch MySQL-Queries..
    Ich hoffe du verstehst mich :S
    Mit der Lösung die ich als letztes gepostet habe, funktioniert es leider nicht :(
    LG
    Merio

    Merio schrieb:

    Mit der Online-Datenbank kann ich keine Datei auswählen, so wie in dem Tut und deswegen ist das leider keine Lösung.
    wie gesagt: das hat damit nix zu tun. Ich verstehe nichtmal, was du mit "Datei auswählen" genau meinst - in keinem der Samples wird eine Datei ausgewählt.

    Ich stelle eine Verbindung mit der Datenbank über die MySQL.Data.dll her und mache dann alles per Code, auch MySQL-Queries..

    Es kommt nur drauf an, ob du typisierte DataTables befüllst oder nicht.

    An typisierte DataTables kann man DGVs binden oder auch Pictureboxen, und die zeigen dann die Bildchen wie gewünscht.
    Mit Datei auswählen meine ich, eine Datenquelle hinzuzufügen..
    Ich kann dir nicht genau erklären, wie das mit der Mysql.Data.dll funktioniert, aber es funktioniert ;DD

    VB.NET-Quellcode

    1. cnn = New MySqlConnection(String.Format("Server=127.0.0.1;uid='{0}';pwd='{1}';", uname, pwd))
    2. cnn.Open()

    Î damit kann man zur Datenbank verbinden..
    mit

    VB.NET-Quellcode

    1. Dim cmd As New MySqlCommand("SELECT * FROM `database`.`table` ;", cnn)
    2. Dim mydat As MySqlDataReader = cmd.ExecuteReader

    kann man alle Einträge aus der Tabelle "table" in der Datenbank "database" auslesen und in einem MySqlDataReader "speichern".

    was ich hier versuche ist folgendes:
    Das ist zum Einspeisen des Bilds in die Datenbank:

    VB.NET-Quellcode

    1. Dim cmm As String = String.Format("INSERT INTO `database`.`table` VALUES ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}');", TextBox1.Text, ComboBox1.Text, TextBox2.Text, MaskedTextBox1.Text.Replace("€", Nothing).Replace(" ", "0"), MaskedTextBox2.Text.Replace(" ", Nothing), "0", MaskedTextBox2.Text.Replace(" ", Nothing), ComboBox2.Text, TextBox3.Text, ImageToBase64(PictureBox1.Image))
    2. Dim cmd As New MySql.Data.MySqlClient.MySqlCommand(cmm, K_System.cnn)
    3. Try
    4. cmd.ExecuteNonQuery()
    5. Catch ex As Exception
    6. MsgBox(ex.Message, MsgBoxStyle.Critical)
    7. End Try

    und das hier zum Auslesen und Abbilden in einer Picturebox:

    VB.NET-Quellcode

    1. Dim cmd As New MySqlCommand("SELECT Img FROM `database`.`table` WHERE `Feld1`=0000000000000;", cnn)
    2. Dim mydat As MySqlDataReader = cmd.ExecuteReader
    3. mydat.Read()
    4. PictureBox2.Image = Base64ToImage(mydat.Item(0).ToString)
    5. mydat.Close()

    Die Definitionen für ImageToBase64 und Base64ToImage() hast du oben.

    So funktioniert das mit der MySql.Data.dll..

    Vielleicht verstehst du ja jetzt, dass das mit den VB-Klassen nicht funktioniert. Oder doch?
    Falls ja wär ich dir echt dankbar für eine Lösung, weil das eine Menge Zeit sparen würde, wenn man fast alles per Designer erledigen könnte. :)
    LG
    Merio
    Ja, aber die Lösung hast du doch bereits!

    Die Lösung findet doch auf einer anneren Ebene statt, als auf den unterschiedlichen DataProvidern (MySql, Access, SqlCe...).
    Alle diese Provider laden Daten in ein typisiertes Dataset, und ab da wird nur noch mit dieser einheitlichen Technologie gearbeitet.

    Das NorthwindSample würde 100% genauso funktionieren, wenn die Daten in einer MySql-DB vorlägen.
    Und ob im Internet oder sonstwo ist nochmal irrelevant.

    Es ist auch ein MySql-Sample dabei, aber da habe ich natürlich den ConnectionString unbrauchbar gemacht, weils ist eine MySql-DB im INet, und nichtmal meine.

    Nur um zu zeigen, dass kein Unterschied besteht zu anneren Providern (es wird halt eine MySqlFactory angegeben statt OleDBFactory, SqLiteFactory oder was auch immer))
    Das Problem dabei ist, dass mit den Funktionen die ich gepostet habe, die Bilder
    weder im Datagridview angezeigt werden, noch in der Picturebox. Stattdessen bekomme ich eine Exception:


    €dit:
    Ich glaube ich habe den Fehler gefunden:
    Wenn ich das Ergebnis des Queries:

    VB.NET-Quellcode

    1. Dim cmd As New MySqlCommand("SELECT Img FROM `database`.`table` WHERE `Barcode`=0000000000000;", cnn)

    in einen String konvertiere und ihn in einer MsgBox ausgeben lasse, bekomm ich "System.Byte[]" .. -.-'
    Aber für die Funktion Base64ToImage() brauch ich einen String.. Wie bekomm ich das hin ?
    LG
    Merio

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Merio“ ()

    so kann mans auch sehen.
    "Meine" Methode ist halt die beste, die ich kenne (sonst nähme ich eine annere), und daher auch die beste Hilfe, die ich dir anbieten kann.
    Mit anneren Ansätzen kenne ich mich nicht mehr wirklich aus, bzw. die führen mich im Kreis ("eckard, du bist doch blöd, da jetzt DatagridviewZellen mit OwnerDrawing zu bemalen, wenn du sie nur anzubinden bräuchtest")
    nö - das würde sich finden lassen.

    Aber neuerdings bin ich drauf gekommen (oder wenigstens auf eine plausible Vermutung):
    Databinding holt sich mit TypeDescriptor.GetConverter einen geeigneten Converter (ImageConverter, BitmapConverter, k.A., wie der genau heißt).

    Hey, das ist ja dochn Ansatz, wie mans auch ohne Databinding anfangen könnte! 8o

    Aber diese "Hilfe" ist eher zu deinem Schaden, denn wirklich vorangebracht hätte es dich, wenn du mal anfangen würdest, DataTables per Adapter zu befüllen, und mit Databinding, statt jeden Datensatz einzeln abzurufen und iwie an Controls zuzuweisen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ich arbeite nicht nur mit dem DGV sondern mache auch andere Befehle die sich durch die MySQL.Data.dll seht bequem, halt als MySQLQueries als Strings, handlen lassen. Ansonsten wäre deine Lösung die beste ;) ich schau mal ob ich da was mit den Convertern anfangen kann, weiß auch nicht warum ich da nicht selber drauf gekommen bin :DD
    LG
    Merio