Domanda

Ho provato a leggere un'immagine salvata in Access DB come oggetto OLE in un PictureBox in un'applicazione Windows C #.

Il codice che esegue questa operazione è presentato di seguito:

        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;
        }

Quando eseguo il codice precedente, viene generata un'eccezione 'Parametro non valido' alla riga:

Bitmap bmp = new Bitmap(ms)

Dal messaggio di eccezione, è chiaro che "ms" è in un formato non riconoscibile. Qualche suggerimento per superarlo?

È stato utile?

Soluzione

Il tuo bytestream è in qualche modo corrotto, perché ho provato il tuo metodo esatto ma invece ho riempito l'array di byte con dati PNG da un file.

Suggerirei di creare due flussi, uno dal database e uno dal file che era l'origine dell'immagine nel database. Quindi confrontali byte per byte. Se esiste persino un byte di diffrenza, i dati dell'immagine del database sono danneggiati.

Altri suggerimenti

Sfortunatamente non ho una buona risposta per te, ma posso dirti che quando ho provato, ho ottenuto gli stessi risultati. A volte ha saltato i primi 78 byte dell'array di byte ha funzionato, a volte no.

Questo perché il tipo di dati Oggetto OLE memorizza un tipo di intestazione nel campo, in modo che Access sappia che tipo di oggetto OLE è. Non sono riuscito a trovare un modo affidabile per capire esattamente dove si è fermata questa intestazione e sono iniziati i dati reali, ma ho anche rinunciato, quindi buona fortuna :)

Effettua una ricerca su Google per AccessHdr. Troverai riferimenti a AccessHdr.cpp e AccessHdr.h. Ciò illustrerà ciò che è necessario per estrarre i flussi senza l'intestazione.

Non puoi leggere oggetti OLE così facilmente. In effetti, è una cattiva pratica conservare le immagini come oggetti OLE nel database.

Si preferisce avere em come oggetti BLOB o percorso e nome file in alcuni archivi. AccessImagine può gestire entrambi gli scenari per MS Access e C #. Puoi scaricarlo qui - http://access.bukrek.net

Puoi provare:

pbPassport.Image = Image.FromStream(ms);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top