Frage

Ich habe versucht, ein Bild in Access DB als OLE-Objekt in einer PictureBox in einer C # -Windows-Anwendung gespeichert zu lesen.

Der Code, der dies tut, ist im folgenden dargestellt:

        string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Rajesh\SampleDB_2003.mdb;";
        OleDbConnection oConn = new OleDbConnection(connString);
        oConn.Open();
        string commandString = "select * from employee where id = " + id + "";
        OleDbCommand oCmd = new OleDbCommand(commandString, oConn);
        OleDbDataReader oReader = oCmd.ExecuteReader(CommandBehavior.SequentialAccess);

        while (oReader.Read())
        {
            txtID.Text = ((int)oReader.GetValue(0)).ToString();
            txtName.Text = (string)oReader.GetValue(1);
            txtAge.Text = ((int)oReader.GetValue(2)).ToString();
            txtType.Text = (string)oReader.GetValue(3);
            byte[] imageBytes = (byte[])oReader.GetValue(4);

            MemoryStream ms = new MemoryStream();
            ms.Write(imageBytes, 0, imageBytes.Length);
            Bitmap bmp = new Bitmap(ms);
            pbPassport.Image = bmp;
        }

Wenn ich den obigen Code ausführen, ein ‚Parameter ist nicht gültig‘ Ausnahme an der Linie geworfen wird:

Bitmap bmp = new Bitmap(ms)

Von der Ausnahmemeldung, ist es klar, dass ‚ms‘ in einem Format, das nicht zu erkennen ist. Jeder Vorschlag zu erhalten Vergangenheit das?

War es hilfreich?

Lösung

Ihre Bytestrom sind irgendwie beschädigt, becouse ich die genaue Methode von Ihnen versucht, aber den Byte-Array mit PNG-Daten aus einer Datei anstatt gefüllt.

Ich würde vorschlagen, zwei Ströme zu schaffen, eine aus der Datenbank und einen aus der Datei, die die Quelle des Bildes in der Datenbank war. Dann vergleichen sie Byte für Byte. Wenn es auch nur ein Byte diffrence ist, Daten der Datenbank Bild ist beschädigt.

Andere Tipps

Leider habe ich keine gute Antwort für Sie, aber ich kann Ihnen sagen, dass, wenn ich versuchte, ich die gleichen Ergebnisse erhielt. Manchmal das Überspringen der ersten 78 Bytes des Byte-Array gearbeitet, manchmal ist es nicht.

Das ist, da das OLE-Objekt-Datentyp speichert eine Art Header auf dem Feld, so dass Access weiß, welche Art von OLE-Objekt es sich handelt. Ich konnte keine zuverlässige Art und Weise finden, genau zu arbeiten, wo dieser Header gestoppt und reale Daten begonnen, aber ich habe auch nach oben, so viel Glück:)

Führen Sie eine Google-Suche nach AccessHdr. Sie werden Verweise auf AccessHdr.cpp und AccessHdr.h finden. Diese werden veranschaulichen, was müssen die Ströme zu extrahieren, ohne den Header.

Sie können nicht lesen OLE so leicht Objekte. In der Tat ist es eine schlechte Praxis Bilder zu halten, wie OLE in Datenbankobjekten.

Es ist bevorzugt em als BLOB-Objekte zu haben oder Pfad und Dateinamen an einem bestimmten Speicher. AccessImagine können beide Szenarien für MS Access und C # verarbeiten. Sie können es hier herunterladen - http://access.bukrek.net

Sie können versuchen:

pbPassport.Image = Image.FromStream(ms);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top