Imagenes en SQL Server

03/11/2004 - 09:23 por Miguel Ortiz Falcón | Informe spam
Hola grupo, trabajando con imágenes y SQL Server me dí
cuenta de algunas cosas, asi que decidí poner un nuevo
post para exponerlas.

Una columna en SQL Server que ha sido declarada del tipo
Image realmente no puede contener una imagen, no se cual
sea el fundamento de haberla llamado Image, solo puede
contener 16 bytes. Realmente suena ilógico que una imágen
pueda albergarse en ese espacio, quizás allá cosas como
iconos o cosas asi, pero en fin...

Y bueno obviamente la imágen debe almacenarse como un
binario, pero lamentablemente los binarios que tenemos en
SQL Server (binary y varBinary) sus logintudes máximas
son de 8000 bytes. Asi que llegué a la conclusión que si
queremos almacenar una imágen para un registro X solo
puede ser de un tamaño de no más de 8 kb apox. un poco
menos para ser sinceros.

Todo esto me dí cuenta porque aparentementemente cuando
guardaba la imagen cuando todavía mi columna era del tipo
Image segun todo estaba bien lo guardaba (lo que
realmente hacía es solo guardar máximo 16 bytes de mi
imágen)...entonces al tratar de recuperar la imágen (en
bytes) de la bd y lo siguiente: flujo a memoria, bytes al
flujo, e imagen a partir del flujo...siempre me marcaba
un error.

Entonces lo que hice fue primeramente cambiar mi columna
a varBinary, realmente da lo mismo que sea binary, ambos
su tamaño máximo es de 8000b. Para mayor comodidad hice
una clase Serializadora de imágenes y entonces Serializar
la imagen y guardarla en la bd. y para recuperarla
obtener los bytes de la bd y ponerlos en memoria para de
ahí deserializar la imágen y obtenerla de nuevo. Y
funcionó a la perfección, pero nuevamente les repito con
la gran desventaja de que solo pueden almacenarse
imágenes de no más de 8000bytes.

No sé igual y puedan hacerse trucos como guardar los
bytes como cadenas y convertirlas, etc etc...Pero a mi
parecer consumiría mucho tiempo... así que estoy pensando
seríamente utilizar el camino más facil solo almacenar la
ruta y tener las imágenes en una carpeta...

Qué piensan de esto?...algún comentario?

Saludos
Miguel Ortiz Falcón
michaelof@hotmail.com
 

Leer las respuestas

#1 Enrique
03/11/2004 - 12:18 | Informe spam
Hola, yo pude poner imagenes grandes en una base SqlServer en el campo
imagen, el codigo seria asi:

...
MemoryStream stream = new MemoryStream();
imgFoto.Save(stream, ImageFormat.Jpeg); //La variable imgFoto es una
variabla Image que contiene la imagen que queres guardar.
sqlCmd.Parameters.Add("@Foto",stream.GetBuffer()); //sqlCmd es una variable
SqlCommand


Y para leerla:

byte[] _byte = (byte[])sqlDs.Tables[strTabla].Rows[i]["Foto"];
stream = new MemoryStream(_byte);
pbx.Image = Image.FromStream(stream);//pbx es un PictureBox
pbx.SizeMode = PictureBoxSizeMode.StretchImage;

Preguntas similares