Está en la página 1de 5

Almacenar una Imagen en una Base de Datos

Personas que lo han encontrado til: 21 de 25 Por Miguel Ortiz Falcn Contenido 1. Introduccin 2. Una Base de Datos de Ejemplo 3. Construyendo una Interfaz Grfica 4. Almacenado la Imagen 5. Conclusin 1. Introduccin

En este artculo cubriremos el proceso de almacenar una imagen en una base de datos de SQL Server, basndonos en un ejemplo de un pequeo catlogo de 'Productos'. El almacenamiento de imgenes en bases de datos no suele ser la mejor solucin para el tratamiento de imgenes en las aplicaciones enlazadas a datos; sin embargo, en algunos casos es necesaria esta prctica cuando se desea aprovechar las capacidades del SGBD que se haya elegido. Para comenzar a ejemplificar este proceso, comenzaremos a crear una base de datos de ejemplo la cual se describir en la siguiente seccin. Principio de la pgina 2. Una Base de Datos de Ejemplo

En una base de datos de ejemplo llamada 'Store', crearemos una tabla sencilla llamada 'Productos', cuya definicin ser la siguiente: CREATE TABLE Products ( id int NOT NULL , name nvarchar (80) NOT NULL, quantity int NOT NULL, price smallmoney NOT NULL, productImage image NULL , CONSTRAINT PK_Products PRIMARY KEY CLUSTERED (id) ) Visualmente, en el administrador corporativo, tendra el aspecto que muestra la Figura 1:

Figura 1.

3.

Construyendo una Interfaz Grfica

Construiremos una pequea interfaz grfica que nos servir para obtener los datos de los productos, entre ellos, la imagen. El aspecto del formulario ser el que muestra la Figura 2:

Figura 2. 4. Almacenado la Imagen

Para almacenar los datos (incluyendo la imagen) primero tenemos que ingresarlos en el formulario; para ingresar la imagen nos apoyaremos en un objeto OpenFileDialog, el que usaremos para que el usuario escoja la imagen que quiere asociar al producto, y lo mostraremos cuando el usuario haya hecho clic sobre el botn para navegar (...). Usaremos el siguiente cdigo:

private void browseButton_Click(object sender, System.EventArgs e) { // Se crea el OpenFileDialog OpenFileDialog dialog = new OpenFileDialog(); // Se muestra al usuario esperando una accin DialogResult result = dialog.ShowDialog(); // Si seleccion un archivo (asumiendo que es una imagen lo que seleccion) // la mostramos en el PictureBox de la inferfaz if (result == DialogResult.OK) { pictureBox.Image = Image.FromFile(dialog.FileName); } } Teniendo los datos de entrada que muestra la Figura 3, por ejemplo:

Figura 3.

Teniendo los datos de entrada, incluyendo la imagen y no tomando en cuenta las validaciones sobre el formulario de entrada, lo siguiente ser guardar en s los datos en la base de datos. (Esta accin se produce cuando se hace clic sobre 'Guardar'). Utilizamos el siguiente cdigo para hacerlo: private void saveButton_Click(object sender, System.EventArgs e) { try { // Objetos de conexin y comando System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(@"Data Source= (local);Initial Catalog=store;Integrated Security=SSPI"); System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(); // Estableciento propiedades cmd.Connection = conn; cmd.CommandText = "INSERT INTO Products VALUES (@id, @name, @quantity, @price, @image)"; // Creando los parmetros necesarios cmd.Parameters.Add("@id", System.Data.SqlDbType.Int); cmd.Parameters.Add("@name", System.Data.SqlDbType.NVarChar); cmd.Parameters.Add("@quantity", System.Data.SqlDbType.Int); cmd.Parameters.Add("@price", System.Data.SqlDbType.SmallMoney); cmd.Parameters.Add("@image", System.Data.SqlDbType.Image); // Asignando los valores a los atributos cmd.Parameters["@id"].Value = int.Parse(idBox.Text); cmd.Parameters["@name"].Value = nameBox.Text; cmd.Parameters["@quantity"].Value = int.Parse(quantityBox.Text); cmd.Parameters["@price"].Value = float.Parse(priceBox.Text); // Asignando el valor de la imagen // Stream usado como buffer System.IO.MemoryStream ms = new System.IO.MemoryStream(); // Se guarda la imagen en el buffer pictureBox.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); // Se extraen los bytes del buffer para asignarlos como valor para el // parmetro. cmd.Parameters["@image"].Value = ms.GetBuffer(); conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); } catch (System.Exception ex) { MessageBox.Show(ex.Message); } } Como puedes observar, el cdigo usa parmetros para establecer los valores de los campos. Lo ms interesante est en la parte 'Asignando el valor de la imagen', ya que se usa un flujo de memoria

intermedio para extraer los bytes de la imagen (que es como realmente se guarda en la base de datos, como una secuencia de bytes). Ahora bien, una vez que se tiene el objeto MemoryStream, podemos usar el mtodo Save() del objeto Image, para obtener los bytes de la imagen y colocarlos en un flujo, especificando el tipo de formato de la imagen. Ya con los bytes cargados en el MemoryStream lo ltimo que tenemos que hacer es asignar realmente los bytes en el valor del parmetro, lo que se hace obteniendo el buffer del MemoryStream (los bytes) y asignarlo a la propiedad Value del parmetro. Para referenciar a la imagen en cuestin, se obtuvo desde la propiedad Image del objeto PictureBox; esto es porque se asume que debi de haber estado cargada una imagen en el cuadro. Habr ocasiones en las que no se desee hacer de esta forma, ya sea porque se d una ruta directa a una imagen (en modo texto), etc. Para obtener una referencia a la imagen a almacenar para utilizar el mtodo Save(), podra usarse el mtodo esttico Image.FromFile y se obtendra la referencia a una imagen, o tambin de otra forma, podran leerse los bytes directamente del archivo de imagen, en este caso la lectura habra que llevarla a cabo "manualmente" ya que no se usara el mtodo Save(). Dejo a tu eleccin cualquiera de estas tcnicas, ya que esto puede variar en distintas situaciones. 5. Conclusin

El almacenamiento de imgenes en bases de datos no es una tcnica comnmente utilizada, ya que incrementa drsticamente el tamao de la misma, de cada registro, entre otros inconvenientes; normalmente solo suele almacenarse la ruta de la imagen. Sin embargo en algunas ocasiones es necesario almacenarlas cuando se quiere aprovechar las caractersticas de gestin del SGBD elegido, como por ejemplo en la definicin de un plan de mantenimiento, automatizando las copias de seguridad donde incluira todo el catlogo de imgenes junto con la copia de seguridad. La mejor eleccin de la forma como guardar las imgenes siempre depender del ambiente de operacin de la aplicacin.