Академический Документы
Профессиональный Документы
Культура Документы
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
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.
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
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
System.Drawing
System.Data