C sharp - Problema al leer una imagen de una base de datos

 
Vista:

Problema al leer una imagen de una base de datos

Publicado por Fesioche (5 intervenciones) el 30/12/2009 11:39:59
Buenas!!

Os pego mi código y os indico el error:
<code>

//leido es un Dataset que contiene la imagen en la tabla "tablita", row "0" y campo "imagen"

// El campo imagen primero se almacena en un buffer
byte[] imageBuffer = (byte[])leido.Tables["tablita"].Rows[0]["imagen"];

// Se crea un MemoryStream a partir de ese buffer
MemoryStream ms = new MemoryStream(imageBuffer);

// Se utiliza el MemoryStream para extraer la imagen
//Aquí está el error!!!
pictureBox.Image = Image.FromStream(ms);

</code>

El error es que Image.FormStream no tiene ningún método sobrecargardo que reciba un MemoryStream, tiene 3 método sobrecargados y en todos ha de recibir un Stream, por lo que el propio compilador me da un error tipo: "Parameter is not valid".
La imagen está guardada en la base de datos como jpg.
El tipo de la columna en la base de datos es "image".
Y lo peor de todo es que la propia ayuda de microsoft te indica que se hace de este modo:
http://msdn.microsoft.com/es-es/library/bb972267.aspx#EBAA
He buscado en diferentes sitios y todos lo hacen de esta misma forma.
Utilizo Sql Server 2005, Visual Studio 2005 versión 8.0, Microsoft .Net Versión 2.0

Agradecería vuestra ayuda ;)
Gracias de antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de roger

RE:Problema al leer una imagen de una base de dato

Publicado por roger (160 intervenciones) el 30/12/2009 14:00:44
si haces Image.FromStream(MiMemoryStream); no te debe marcar un error de compilacion, pues MemorySream es un Stream valido. Mas bien creo que el error te aparece en tiempo de ejecucion y con los datos que estan guardados en la base de datos. Prueba con ese mismo codigo pero en vez de traer la imagen de BD, prueba con una imagen que tengas guardada en tu equipo, obteniendo los bytes de ella y asignandola, por ejemplo:

FileStream objStream = new FileStream(@"Ruta\archivo.jpg", FileMode.Open);
byte[] array= new byte[objStream.Length];
objStream.Read(array, 0, (int)objStream.Length);
pictureBox1.Image = imagen = Image.FromStream(new MemoryStream(array));

Si asi te funciona, habria que entrar a revisar lo que hay en la base de datos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema al leer una imagen de una base de dato

Publicado por Fesioche (5 intervenciones) el 31/12/2009 10:31:13
Lo primero pedir perdón por mi error, efectivamente el error me sale en tiempo de ejecución y no de compilación.
Detalles a tener en cuenta:
-Arquitectura en capas
-Utilizo Enterprise Library 3.1 Mayo 2007, para gestionar el acceso a base de datos.

He probado tu solución roger, y me funciona, cogiendo una foto que tengo en mi equipo y tratándola como me has indicado, no tengo ningún problema, asique te indico como guardo la foto en la base de datos

<code>
DbCommand cmd = obj_conexion.CreateCommand();

System.IO.MemoryStream ms = new System.IO.MemoryStream();
Image imagen = Image.FromFile(@"Ruta\archivo.jpg");

imagen.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
string instruccion_sql = "INSERT INTO Foto (fk_numerodocumento_documento, imagen) VALUES ('" + 1 + "','" + ms.GetBuffer() + "')";

cmd.CommandText = instruccion_sql;
cmd.ExecuteNonQuery();
</code>
Por tanto lo que hago es guardar una imagen que tengo en mi equipo en la tabla foto.
El valor "1" de fk_numerodocumento_documento indica que esa foto pertenece al documento nº 1, el cual he verificado que existe en la base de datos.

La tabla que contiene la foto en la base de datos tiene 3 campos
1)Numero de tipo int not null que se autoincrementa solo
2)fk_numerodocumento_documento tipo int not null que es una clave externa y a su vez clave primaria de esta tabla
3)imagen tipo image

Cuando guardo la foto en la base de datos, si miro manualmente la base de datos me aparece

numero: 1
fk_numerodocumento_documento: 1
imagen: <datos binarios>
Por lo que intuyo que se ha almacenado correctamente, y para dejar de intuir y verificar quiero leer la foto de la base de datos y mostrarla.

A la hora de leer la foto:
<code>
public DbDataAdapter BuscarFoto(int fk_numerodocumento_documento)
{
DbDataAdapter leido;
string instruccion_sql = "SELECT * FROM foto where fk_numerodocumento_documento = '"+fk_numerodocumento_documento+"'";
leido = CrearSqlAdapter(instruccion_sql);
return leido;
}
</code>
Donde CrearSqlAdapter(instruccion_sql) es:
<code>
public DbDataAdapter CrearSqlAdapter(string instruccion)
{
DbDataAdapter adp = conexionDB.GetDataAdapter();
adp.SelectCommand = conexionDB.GetSqlStringCommand(instruccion);
adp.SelectCommand.Connection = obj_conexion;

return adp;
}
</code>

y ya en mi capa de aplicación el código es:
<code>
DataSet leido = new DataSet();
DbDataAdapter adp;

//He omitido el código de conexión con la base de datos porque está
//más que verificado que funciona

adp = iadb.BuscarFoto(1);
adp.Fill(leido, "tablita");

// El campo imagen primero se almacena en un buffer
byte[] imageBuffer = (byte[])leido.Tables["tablita"].Rows[0]["imagen"];

// Se crea un MemoryStream a partir de ese buffer
MemoryStream ms = new MemoryStream(imageBuffer);

// Se utiliza el MemoryStream para extraer la imagen

//ATENCIÓN!!! DA ERROR EN TIEMPO DE EJECUCIÓN!!!
pictureBox.Image = Image.FromStream(ms);
</code>

Siento tanto texto, pero creo que era necesario explicar todos los detalles. Si puedes ayudarme te lo agradecería, mientras tanto seguiré investigando. Si encuentro la solución la publico.
Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de roger

RE:Problema al leer una imagen de una base de dato

Publicado por roger (160 intervenciones) el 04/01/2010 14:18:16
prueba haciendo este insert parametrizado
string instruccion_sql = "INSERT INTO Foto (fk_numerodocumento_documento, imagen) VALUES ('" + 1 + "','" + ms.GetBuffer() + "')";

seria algo asi

string instruccion_sql = "INSERT INTO Foto (fk_numerodocumento_documento, imagen) VALUES (@numero,@imagen)";

para de esa forma indicar el tipo de dato al cual corresponde cada parametro

System.Data.SqlClient.SqlParameter objParametro = new System.Data.SqlClient.SqlParameter("@imagen", SqlDbType.Image);
objParametro.Value = ms.GetBuffer() ;
cmd.Parameters.Add(objParametro);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema al leer una imagen de una base de dato

Publicado por Fesioche (5 intervenciones) el 06/01/2010 11:38:10
Perfecto!!! esa es la solución, hay que indicar específicamente el tipo "image" mediante parametros quedando el código:

public void IntroducirFoto(int fk_numerodocumento_documento,Image img)
{
DbCommand cmd = obj_conexion.CreateCommand();

MemoryStream ms = new System.IO.MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

string instruccion_sql = "INSERT INTO Foto (fk_numerodocumento_documento, imagen) VALUES (@numero,@imagen)";

cmd.CommandText = instruccion_sql;

SqlParameter par_numero = new SqlParameter("@numero", SqlDbType.Int);
SqlParameter par_imagen = new SqlParameter("@imagen", SqlDbType.Image);

par_numero.Value = fk_numerodocumento_documento;
par_imagen.Value = ms.GetBuffer();

cmd.Parameters.Add(par_numero);
cmd.Parameters.Add(par_imagen);

cmd.ExecuteNonQuery();
}//fin función IntroducirFoto

¡¡¡Muchísimas gracias Roger!!!

Espero que esta solución pueda servir a mucha más gente

Salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar