2 Stimmen

Abrufen von langen Binärdaten (Bildern) aus Access mit VB.NET

Mein Code ist

Dim con As New OleDb.OleDbConnection
    Dim dbProvider As String
    Dim dbSource As String

    dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
    dbSource = "Data Source=" & My.Settings.bowlingballdatabase

    Dim selectString As String = "Select Picture From BowlingBall WHERE LName = 'Smith'"
    Dim oleConnect As New OleDb.OleDbConnection
    oleConnect.ConnectionString = dbProvider & dbSource
    oleConnect.Open()
    Using oleDBCmd As OleDb.OleDbCommand = oleConnect.CreateCommand()
        oleDBCmd.CommandType = CommandType.Text
        oleDBCmd.CommandText = selectString
        Using oleDbReader As OleDb.OleDbDataReader = oleDBCmd.ExecuteReader()
            oleDbReader.Read()
            Dim ImageBytes As Byte() = CType(oleDbReader(0), Byte())
            Dim ms As New MemoryStream(ImageBytes)
            Dim img As Image = Image.FromStream(ms)
            Me.PictureBox1.Image = img
        End Using
    End Using
    oleConnect.Close()

Ich denke, es könnte ein Problem mit den SQL-Befehlen sein? Ich erhalte den Fehler "Parameter ist ungültig" auf der folgenden Zeile:

Dim img As Image = Image.FromStream(ms)

1voto

Gord Thompson Punkte 105785

Es ist nichts grundsätzlich falsch an deinem Code per se. Dein Problem hängt höchstwahrscheinlich mit der Art und Weise zusammen, wie Access Bilder speichert, wenn sie direkt aus der Access-Anwendung eingebettet sind. In solchen Fällen wird ein OLE-"Wrapper" zu den Rohbilddaten hinzugefügt, bevor sie in der Tabelle gespeichert werden. Dies funktioniert gut, wenn man Bilder innerhalb von Access behandelt, kann jedoch Probleme verursachen, wenn man mit diesen Bildern aus externen Anwendungen wie deinem .NET-Projekt arbeitet.

Dein Code ruft das OLE-umwickelte Bildobjekt aus der Access-Datenbank ab und versucht, ein .NET Image Objekt damit zu erstellen. Das Problem liegt darin, dass während das Image Objekt eine Vielzahl von Bildtypen erkennen kann (z.B. Bitmap, JPEG, etc.), das "OLE-umwickelte Bildobjekt-Format" keines davon ist. Daher musst du den OLE-Wrapper aus dem Datenstrom entfernen, bevor du ihn an Image.FromStream() übergibst.

Weitere Details findest du in meiner anderen Antwort hier, die zeigt, wie man Objekte mithilfe des Codes aus einer früheren Antwort hier "entpackt".

-2voto

user2930100 Punkte 346

Wenn Sie oleDbReader(0) ausführen, erhalten Sie den Feldnamen des ersten Feldes im zurückgegebenen Reader-Objekt. Verwenden Sie oleDbReader(0)(0), um das erste Element in der ersten Spalte zu erhalten, Sie wissen, wie es geht.

Dim ImageBytes As Byte() = CType(oleDbReader(0)(0), Byte())

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X