Pregunta

He intentado leer una imagen guardada en Access DB como un objeto OLE en un PictureBox en una aplicación de Windows C #.

El código que hace esto se presenta a continuación:

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

Cuando ejecuto el código anterior, se lanza una excepción 'El parámetro no es válido' en la línea:

Bitmap bmp = new Bitmap(ms)

Del mensaje de excepción, está claro que 'ms' está en un formato que no es reconocible. ¿Alguna sugerencia para superar esto?

¿Fue útil?

Solución

Su bytestream está dañado de alguna manera, porque probé el método exacto suyo pero llené la matriz de bytes con datos PNG de un archivo.

Sugeriría la creación de dos secuencias, una desde la base de datos y otra desde el archivo que fue la fuente de la imagen en la base de datos. Luego compárelos byte por byte. Si hay incluso un byte de diferencia, los datos de la imagen de la base de datos están dañados.

Otros consejos

Lamentablemente no tengo una buena respuesta para ti, pero puedo decirte que cuando lo intenté obtuve los mismos resultados. A veces, omitir los primeros 78 bytes de la matriz de bytes funcionó, a veces no.

Esto se debe a que el tipo de datos del objeto OLE almacena algún tipo de encabezado en el campo, de modo que Access sepa qué tipo de objeto OLE es. No pude encontrar una manera confiable de averiguar exactamente dónde se detuvo este encabezado y cómo comenzaron los datos reales, pero también me di por vencido, así que buena suerte :)

Haga una búsqueda de google para AccessHdr. Encontrará referencias a AccessHdr.cpp y AccessHdr.h. Esto ilustrará lo que se necesita para extraer las secuencias sin el encabezado.

No puede leer objetos OLE tan fácilmente. De hecho, es una mala práctica mantener las imágenes como objetos OLE en la base de datos.

Se prefiere tener em como objetos BLOB o ruta y nombre de archivo en algún almacenamiento. AccessImagine puede manejar ambos escenarios para MS Access y C #. Puede descargarlo aquí: http://access.bukrek.net

Puedes probar:

pbPassport.Image = Image.FromStream(ms);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top