26 de Octubre de 2014
Dic
14

.NET Tutorial 58: Guardar y Recuperar una imagen de SQL Server

Categorías: 

Hoy veremos como guardar y recuperar una imagen que está almacenado en un campo de una tabla de SQL Server.

Dejando a un lado el tema de los FILESTREAM que fue introducido en SQL Server 2008, veremos que es posible guardar y recuperar una imagen desde una tabla "estándar" (nada de tablas de tipo FILESTREAM).

Antes de empezar indicar que existe un campo en SQL Server que es de tipo "Imagen". Sin embargo, siguiendo las recomendaciones de la MSDN (link) no se usará un campo de tipo imagen. Se usará un campo de tipo varbinary(MAX) para dicho propósito, ya que tal y como se indica en el link anterior, el tipo "Image" será eliminado en un futuro:

ntext , text, and image data types will be removed in a future version of Microsoft SQL Server. Avoid using these data types in new development work, and plan to modify applications that currently use them. Use nvarchar(max), varchar(max), and varbinary(max) instead.

 

Pues bien, lo primero es crear una tabla para almacenar los datos. Yo he creado una tabla llamada IMAGENES con los siguientes campos:


(Haz click para agrandar)

Desde Visual Studio tendremos 3 métodos:

  • InsertarFotoEnBDD
  • ObtenerFotoDeBDD
  • Image ObtenerBitmapDeBDD

 

InsertarFotoEnBDD 

Este método no devuelve nada. Se le pasará un identificador para la foto y la ruta y nombre de dicha foto.

Con la ruta y nombre de la foto se construye un MemoryStream que se le pasa como parámetro al query que hace un insert en la tabla de la base de datos.

El código es este:


(Haz click para agrandar)


ObtenerFotoDeBDD

Este método tampoco devuelve nada. Lo que hace este método es recuperar una foto de la base de datos cuyo ID es el especificado y guardar dicha imagen en una carpeta del disco duro

De nuevo, se usa un MemoryStream para recuperar la imagen del campo varbinary y luego mediante un FileStream se guarda el fichero.

El código es este:


(Haz click para agrandar)


ObtenerBitmapdeBDD

Esta función recupera la imagen de la base de datos, pero en lugar de generar un fichero, lo que hace es devolver un objeto de tipo Bitmap. Una vez que se tiene dicho Bitmap puedes manipularlo como quieras.

El código es este:


(Haz click para agrandar)

 

Probando el ejemplo

Nuestro interface tendrá unos cuantos botones para realizar las acciones, una caja de texto para especificar el ID y un picturebox para mostrar las imágenes.

Si establecemos el ID a 1 y seleccionamos una imagen:

Al pulsar en el botón Guardar en BDD se llama al método InsertarFotoEnBDD de esta forma:

InsertarFotoEnBDD(Num, lblRutaImagen.Text);

Después de insertar unas cuantas fotos podemos ver los datos de dicha tabla:


(Haz click para agrandar)

Los mismos datos pero desde el Mamagement Studio:


(Haz click para agrandar)

Si especificamos un ID, por ejemplo el 3 y pulsamos en el botón "recuperar desde BDD en un objeto image" se está ejecutando la función ObtenerBitmapDeBDD de esta forma:

pictureBox1.Image = ObtenerBitmapdeBDD(Num);

Y como puede verse, el picturebox se actualiza con el contenido de dicha imagen:


Por último., si especificamos un ID, por ejemplo el 1 y pulsamos en el botón "recuperar desde BDD y generar un fichero en C:\Temp" se está ejecutando el método ObtenerFotoDeBDD de esta forma:

ObtenerFotoDeBDD(Num, @"C:\temp\");

Si accedemos a la carpeta C:\temp vemos que efectivamente, la foto se ha recuperado de la base de datos y se ha guardado en dicha carpeta: 


Bueno, pues como veis es bastante sencillo tanto guardar como recuperar una imagen.

Los ejemplos completos los tenéis aquí (se da por supuesto que tendrás que especificar una cadena de conexión adecuada a tu SQL Server y tener la tabla generada con los campos que se comentaron al inicio del post) 

Código de ejemplo en C#

Código de ejemplo en VB.NET

 

 Tags: SQL Server varbinary, Guardar imagen en base de datos, Fichero, File in Data Base, .NET, C#


Saludos.
mov eax,ollydbgInt 13h  


 

Ollydbg ProSignature   

 

0

1 Comentario:

Contacto

Hola Me gustaria me enviaras un email donde poderte contactar, tengo una proposicion que hacerte. Mi sitio web: www.hacha.org Un abrazo Leonardo