Вы находитесь на странице: 1из 6

Usar imgenes de una base de SQL Server

2005
Cmo usar imgenes guardadas en una base de datos de SQL Server 2005 (guardar y
recuperar una imagen en/de un campo de tipo image). Y como de costumbre, con cdigo
para VB como para C#.
Introduccin:

En este artculo te voy a explicar (de la forma ms sencilla posible) cmo trabajar con
imgenes para guardarlas en una base de datos de SQL Server 2005.
Por supuesto tambin te explicar cmo recuperar una imagen de la base de datos y
mostrarla en un control de tipo PictureBox.
Para este ejemplo, voy a usar una clase muy simple en la que tengo definido dos mtodos
compartidos (o estticos), uno de ellos te permitir convertir una imagen en un array de
tipo Byte (espera! no te desesperes! ahora te explico porqu convertir una imagen a un
array de bytes), y la otra para lo contrario, es decir, convertir un array de bytes en un
objeto de tipo Image.
Lo de trabajar con un array de bytes es porque en realidad un campo de tipo image de
SQL Server es un array de bytes. Sabiendo esto, puedes adivinar que el primer mtodo
servir para poder guardar una imagen en el campo de la tabla y el segundo para leer el
contenido de ese campo y poder usarlo como una imagen normal.
Aqu tienes el cdigo de esos dos mtodos, tanto para Visual Basic como para C#. Estos
dos mtodos estn definidos en una clase llamada TablaNavegar y como ves son estticos
(compartidos), por tanto para usarlos no es necesario crear una instancia de esa clase, sino
que se usarn indicando el nombre de la clase seguida del mtodo a usar (en un momento
te explico cmo usarlos).
Public Shared Function Image2Bytes(ByVal img As Image) As Byte()
Dim sTemp As String = Path.GetTempFileName()
Dim fs As New FileStream(sTemp, FileMode.OpenOrCreate,
FileAccess.ReadWrite)
img.Save(fs, System.Drawing.Imaging.ImageFormat.Png)
fs.Position = 0
'
Dim imgLength As Integer = CInt(fs.Length)
Dim bytes(0 To imgLength - 1) As Byte
fs.Read(bytes, 0, imgLength)

fs.Close()
Return bytes
End Function
Public Shared Function Bytes2Image(ByVal bytes() As Byte) As Image
If bytes Is Nothing Then Return Nothing
'
Dim ms As New MemoryStream(bytes)
Dim bm As Bitmap = Nothing
Try
bm = New Bitmap(ms)
Catch ex As Exception
System.Diagnostics.Debug.WriteLine(ex.Message)
End Try
Return bm
End Function

public static byte[] Image2Bytes(Image img)


{
string sTemp = Path.GetTempFileName();
FileStream fs = new FileStream(sTemp, FileMode.OpenOrCreate,
FileAccess.ReadWrite);
img.Save(fs, System.Drawing.Imaging.ImageFormat.Png);
fs.Position = 0;
//
int imgLength = Convert.ToInt32(fs.Length);
byte[] bytes = new byte[imgLength];
fs.Read(bytes, 0, imgLength);
fs.Close();
return bytes;
}
public static Image Bytes2Image(byte[] bytes)
{
if (bytes == null) return null;
//
MemoryStream ms = new MemoryStream(bytes);
Bitmap bm = null;
try
{
bm = new Bitmap(ms);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
return bm;
}

El mtodo Image2Bytes recibe como parmetro un objeto de tipo Image, crea un fichero
temporal y lo guarda como PNG, lee el contenido de ese fichero y lo asigna a un array de
tipo Byte, para finalmente devolver dicho array.
Por otro lado, el mtodo Byte2Image recibe un array de bytes como parmetro, lo asigna a

un objeto del tipo MemoryStream y ese "stream" lo utiliza para crear un objeto del tipo
Bitmap, finalmente devuelve ese objeto que en el fondo es un objeto de tipo Image.
Como puedes comprobar la parte ms simple es la de convertir el array de bytes en una
imagen, operacin que puedes realizar en una sola pasada, al menos si no haces ningn
tipo de comprobacin de error.

Veamos ahora cmo usar estos mtodos.


El primer caso, ser para asignar a un campo de tipo image de una tabla de SQL Server el
contenido de un control PictureBox. En el siguiente cdigo, se supone que la variable dr
es del tipo DataRow y que el campo de la tabla en la que vamos a guardar la imagen se
llama Foto, de igual forma el control que tiene la imagen se llama FotoPictureBox.
dr("Foto") = TablaNavegar.Image2Bytes(Me.FotoPictureBox.Image)
dr["Foto"] = TablaNavegar.Image2Bytes(this.FotoPictureBox.Image);

Para asignar la imagen que est guardada en la base de datos al control FotoPictureBox lo
haremos de esta forma:
If dr("Foto") IsNot DBNull.Value Then
Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"),
Byte()))
If img IsNot Nothing Then
Me.FotoPictureBox.Image = img
End If
End If
if( dr["Foto"] != DBNull.Value )
{
Image img = TablaNavegar.Bytes2Image((byte[])dr["Foto"]);
if( img != null )
{
this.FotoPictureBox.Image = img;
}
}

Por supuesto, esto tambin lo puedes hacer de una pasada, al menos si no quieres
comprobar si el objeto ledo de la base de datos no es un valor nulo ni el resultado
devuelto por la funcin tampoco lo es.

Y esto es todo.

En el ZIP con el cdigo tienes un proyecto de prueba tanto para Visual Basic como para
C# (para usar con la versin 2005 de Visual Studio o con las versiones Express) en el que
se usa la clase TablaNavegar y en el que se accede a una base de datos de SQL Server que
est en la instancia de SQLEXPRESS. Esa base de datos se llama conImagenes y la tabla
se llama conFotos.
Si quieres crear la base de datos, te comento que la estructura de la tabla es la siguiente:
Campo

Tipo

ID

int

Nombre

nvarchar(255)

Foto

image

El campo ID es un campo de identidad (auto incremental), mejor ser que te lo muestre.


En la figura 1 puedes ver la estructura de la tabla.

Figura 1. Estructura de la tabla de prueba

En el ZIP incluyo una copia de seguridad de la base de datos de prueba, para restaurar esa

base de datos puedes leer lo que hace un rato publiqu, tal como est el cdigo la
instancia de SQL Server debe ser SQLEXPRESS, pero si la restauras en la instancia
predeterminada de SQL Server tendrs que cambiar la cadena de conexin usada para
acceder a la base de datos.
Slo decirte que esa base de datos la tengo en el directorio: C:\Archivos de
programa\Microsoft SQL Server\MSSQL.1\MSSQL\Data, por tanto si te da error al
restaurarla, tendrs que cambiar la ubicacin, pero eso ya te lo explico en el artculo del
link anterior.

AMPPFPWZ.301

EUR

_xclick

guille@elguille.inf

(optional instructi

Imagenes SQL Se

http://w w w .elgui

http://w w w .elgui

Aporta tu granito de arena...

Espero que te sea de utilidad.


Nos vemos.
Guillermo

Espacios de nombres usados en el cdigo de este artculo:

System.Drawing
System.Data

Cdigo de ejemplo (comprimido):

Fichero con el cdigo de ejemplo: Imagenes_SQL1.zip - 43.9 KB


(MD5 checksum: 0829132FED4057D67415BCEBF3F5A8EE)

Fichero con la base de datos de ejemplo: conImagenes2.zip 290.0 KB


(MD5 checksum: 8DDC69B22265F7B8EBB18BDCEFA93F6D)

Вам также может понравиться