Bild aus MSSQL DB in PictureBox anzeigen

  • VB.NET

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

    Bild aus MSSQL DB in PictureBox anzeigen

    Hi,

    ich versuche seit Stunden ein Bild aus einer MSSQL DB in einer PictureBox anzuzeigen, ich schaffe es aber einfach nicht.
    Mein Code:

    VB.NET-Quellcode

    1. Dim con As New Odbc.OdbcConnection Dim cmd As New Odbc.OdbcCommand Dim reader As Odbc.OdbcDataReader con.ConnectionString = DSN & ";" _ & UID & ";" _ & PWD & ";"
    2. cmd.Connection = con cmd.CommandText = "SQL Abfrage"
    3. Try con.Open() reader = cmd.ExecuteReader() Do While reader.Read()
    4. Try PictureBox1.Image = Image.FromFile(reader("pict")) Catch ex As Exception MsgBox(ex.Message) End Try
    5. Loop
    6. reader.Close() con.Close()
    7. Catch ex As Exception MsgBox(ex.Message) End Try



    Wisst ihr weiter?

    Grüße Benny
    VB-Tag richtig benutzen

    TryCatch ist ein heißes Eisen

    Das Gefummel mit Sql ist übrigens komplett entbehrlich, wenn du mit typisiertem Dataset arbeitest. Zum Einstieg: "Datenbank in 10 Minuten" auf Movie-Tuts
    Dort sind die Bilder aber total unansehnlich, nämlich einfach im Datagridview mit drin angezeigt.

    Aber bei typDataset kann man auch Bilder-Spalten an Pictureboxen binden - gugge die DBExtensions - Samples
    Danke für deine Antwort, ich habe mir das Tutorial angeschaut. Ich habe leider das Problem, dass die Datenbank auf einem Server läuft und ich darum über ODBC mit ihr kommunizieren muss. Gibt es eine Möglichkeit so eine Datenbank direkt in die Anwendung einzubinden? Ich muss alle DataGridViews von Hand füllen und mit unendlich vielen Arrays arbeiten, da ich bis jetzt keine vernünftige Möglichkeit gefunden habe, mit der DB zu arbeiten...
    Ob nu OleDB, ODBC, Jet-Provider, MySql oder sonstwas: Alle DB-Zugriffstechnologien werden in Ado.Net ganz einheitlich behandelt: providerspezifische DataAdapter befüllen ein Dataset, bzw. speichern Änderungen zurück.

    Kennst du ObjectBrowser? Da kannste mw. mal den Namespace OleDB durchgucken, und vergleichen mit dem Kram im Namespace ODBC - ist echt alles dasselbe.
    Danke für Deine Antwort, jetzt ändert sich wenigstens die Fehlermeldung ;)

    VB.NET-Quellcode

    1. Dim con As New Odbc.OdbcConnection
    2. Dim cmd As New Odbc.OdbcCommand
    3. Dim reader As Odbc.OdbcDataReader
    4. Dim MS As New MemoryStream
    5. con.ConnectionString = DSN & ";" _
    6. & UID & ";" _
    7. & PWD & ";"
    8. cmd.Connection = con
    9. cmd.CommandText = "select * from tArtikelBild Where kArtikelBild=29"
    10. Try
    11. con.Open()
    12. reader = cmd.ExecuteReader
    13. Do While reader.Read()
    14. Try
    15. MS = reader("pict")
    16. PictureBox1.Image = Image.FromStream(MS)
    17. Catch ex As Exception
    18. MsgBox(ex.Message)
    19. End Try
    20. Loop
    21. reader.Close()
    22. con.Close()
    23. Catch ex As Exception
    24. MsgBox(ex.Message)
    25. End Try


    Bekomme folgende Fehlermeldung:

    Das Objekt des Typs "System.Byte[]" kann nicht in Typ "System.IO.Memory Stream umgewandelt werden.

    Grüße Benny
    MS = new MemoryStream(reader("pict"))
    Ein MemoryStream ist keine ByteArray.

    Du solltest den stream am Besten auch noch closen und disposen (NACH der Verwendung; sonst Errors und so)
    MS.Close()
    MS.Dispose()

    ...oder Using benutzen.


    Im Übrigen solltest du wirklich kein Try-Catch verwenden.
    Von meinem iPhone gesendet

    fanello schrieb:

    Danke für Deine Antwort, jetzt weiß ich aber immer noch nicht wie ich ein Bild abrufen kann :(

    wozu willst du es abrufen? Du willst es anzeigen, steht in post#1, und ich habe dir in post#2, im 3. Link Beispiele gegeben, bei denen das per Databinding gelöst ist.
    Ein explizites Abrufen der Bilder ist nicht erforderlich, um sie anzuzeigen.
    keine Ahnung, wie eine DB einem Programm "gehören" kann, auch nicht wirklich, wasses wohl bedeutet, eine DB direkt einzubinden.

    Aber das ist ja auch egal, das beispielhafte an meine Beispiele ist, dass Bilder in einem Dataset hineingeladen wurden, und dass man sie per Databinding in einer Picturebox (und übrigens in jedem anneren Control auch) anzeigen kann.

    Hat mit Datenbanken eiglich nix zu tun - ist eine andere Baustelle, wie die Bilder ins Dataset laden. Eine Möglichkeit ist, sie aus einer Datenbank ins Dataset zu laden.
    Ich glaube ich weiß, warum wir aneinander vorbei geredet haben.
    Ich habe VB 2010 Express benutzt, dort kann man nur SQL Verbindungen mit Datenbankdateien herstellen......
    Jetzt benutze ich Visual Studio 2010 Premium und auf einmal kann ich auch eine SQL DB hinzufügen.....
    So jetzt arbeite ich mit typisiertem Dataset, ist wirklich deutlich angenehmer.
    Ich entwickel das Programm an einer Kopie der original DB, zu welcher ich ein paar Tabellen hinzufügen muss. Das geht wunderbar über den Editor oder per Verbindung zu DB aufnehmen und Befehl absetzen, so wie ich es am Anfang gemacht habe.
    Wenn ich über den Editor gehe habe ich nur das Problem, das die benötigten Tabellen später in der original DB nicht vorhanden sind. Gibt es eine Möglichkeit die Tabellen auch "schöner" zu erstellen, oder sollte ich besser ein Skript schreiben das beim Start des Programms prüft ob die DBs vorhanden sind und falls nicht diese erstellt?
    ich bin immer dafür, eine Anwendung zunächst ohne DB zu proggen - DatasetOnly.
    Es reicht normalerweise, die DB erst dann zu hinterlegen, wenn die App ansonsten wirklich fertig ist.
    Ist man so weit, dann kann man eine dem Dataset entsprechende DB in 1-2 h hinterlegen - vorgestern habichs in 20 Minuten geschafft :D
    Danke für Deine schnelle Antwort. Ich muss mich wahrscheinlich etwas genauer Ausdrücken.
    Mein Programm liest Daten aus der DB eines Warenwirtschaftssystems aus und verarbeitet diese weiter. Wenn nun jemand das Programm zum ersten mal startet fehlen dem Programm die Tabellen, die es zum arbeiten benötigt. Meine Frage war nun, wie ich am geschicktesten vorgehe, um die Tabellen der Datenbank automatisch hinzuzufügen.
    Ich versuche es anderes.
    Ich update mein Programm und es kommen neue Tabellen hinzu. Wen nun jemand auf die neue Version umstellt, müssen bei ihm neue Tabellen hinzugefügt werden und alte unter Umständen verändert werden. Ich nehme an, dass das nicht automatisch passiert, oder etwa doch?

    Edit: Typisierte Datasets arbeiten ja nur mit bestehenden Tabellen, die Tabellen und deren Spalten müssen aber erstmal angelegt werden, um diesen Vorgang geht es mir.

    Edit: Das was in "Datenbanken in 10 Minuten" in Kapitel 6 gezeigt wird möchte ich automatisch von meinem Programm erledigen lassen, meine Frage ist, wie gehe ich hierzu am geschicktesten vor?

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

    also deine Anwendung entwickeln kannste nur, wenn du als Programmierer weitere DataTables anlegst.

    Wenndedann mit der bestehenden DB weiter-arbeiten willst, musste auch in der DB die entsprechenden Tabellen anlegen - meintest du das?

    Inne DB kann man Tabellen anlegen und konfigurieren durch Sql-Commands, Create Table, Create Index, Create Constraint und so Zeugs - Befehle, die genau einmal abgefahren werden müssen.
    Die genauen Befehle kenne ich nicht, weil ich bisher das Glück hatte, von so knifflige Updaterei verschont zu bleiben.
    Mit den Befehlen kann man eine DB glaub auch in einem Sekundenbruchteil ruinieren.
    Also Updaterei ist schon knifflig, weil man da die verschiedensten Versionen, die mit der Zeit so anfallen, sorgfältig beachten muß, damit nicht iwann einer einen Totalschaden erleidet, weil er mw. von Version1 gleich auf Version3 upzudaten versucht, und damit fehlschlägt.