Guardar imagen en base de datos de SQL Server

Existe un gran debate sobre si es correcto o no almacenar imágenes en una base de datos. No entraré en detalle, sin embargo es algo útil que debes de considerar.

La mejor manera de expresarlo es la siguiente frase:

La necesidad tiene cara de hereje.

Ya sea que la necesidad sea trabajo o curiosidad, puedes tomar la siguiente información como referencia.

Como primer paso, es necesario crear un tabla en donde se almacenará la información de la imagen, el script para crearla en SQL Server es el siguiente, en donde se utilizará un campo del tipo varbinary para contener la imagen.

CREATE TABLE Nota ( Id int IDENTITY (1, 1) NOT NULL, Titulo varchar(50) NOT NULL, Imagen varbinary(MAX) NOT NULL) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Para este ejemplo he creado un proyecto de Windows Forms en Visual Studio en donde el formulario principal está dividido en dos pestañas, una para agregar una nueva nota y otra pestaña para consultar una nota por medio de su Id.

En el código del formulario principal, agrega las siguiente referencias:

using System.Data.SqlClient;
using System.IO;

Crea una variable de tipo SqlConnection.


SqlConnection con;

La conexión debe de ser configurada con un ConnectionString con la información necesaria para conectar la aplicación con tu base de datos. Para configurarla puedes hacer uso de un SqlConnectionStringBuilder.


void CrearConexion()
{
   SqlConnectionStringBuilder cs = new SqlConnectionStringBuilder();

   cs.DataSource = @"localhost\SQLEXPRESS";
   cs.InitialCatalog = "testing";
   cs.UserID = "sa";
   cs.Password = "123456";

   con = new SqlConnection(cs.ConnectionString);
}

Grabar

Para almacenar la imagen, una vez obtenida la ruta por medio de un díalogo, debes leer el archivo y almacenarla en un arreglo de bytes. Luego es posible grabar la imagen creando un nuevo registro con un query Insert.


private void btnGuardar_Click(object sender, EventArgs e)
{

   byte[] data = System.IO.File.ReadAllBytes(txtRuta.Text);
   string qry = "insert into Nota (Titulo, Imagen) values (@prTitulo, @prImagen)";

   try
   {
      // Inicializa el objeto SqlCommand
      SqlCommand SqlCom = new SqlCommand(qry, con);

      // Se agrega la información como parámetros
      SqlCom.Parameters.Add(new SqlParameter("@prTitulo", txtTitulo.Text));
      SqlCom.Parameters.Add(new SqlParameter("@prImagen", data));

      // Abrir la conexión y ejecutar el query
      con.Open();
      SqlCom.ExecuteNonQuery();

      // Mostrar un mensaje de confirmación
      MessageBox.Show("Nota almacenada correctamente", "Guardar Nota", MessageBoxButtons.OK,      MessageBoxIcon.Information);
   }
   catch (Exception ex)
   {
      MessageBox.Show(ex.Message);
   }
   finally
   {
      // Cerrar la conexión si esta se encuentra abierta
      if (con.State == ConnectionState.Open)
         con.Close();
   } 
}

Consulta

Para la lectura de la imagen, nuevamente se debe de asignar el contenido de la misma como un arreglo de bytes y luego con la ayuda de un MemoryStream, tratarla para poderla asignar a un PictureBox.

private void btnBuscar_Click(object sender, EventArgs e)
{
   string qry = "select Titulo, Imagen from Nota where Id = @prId";
   try
   {
      // Inicializa el objeto SqlCommand
      SqlCommand SqlCom = new SqlCommand(qry, con);

      // Se agrega la información de búsqueda con parámetros
      SqlCom.Parameters.Add(new SqlParameter("@prId", nudIdNota.Value));

      // Abre la conexión y ejecutar el query
      con.Open();
      SqlDataReader rdr = SqlCom.ExecuteReader();

      Image newImage = null;

      if (rdr.Read())
      {
         // Obtiene los resultados de la búsqueda
         lblNota.Text = rdr.GetString(0);
         byte[] imgData = (byte[])rdr.GetValue(1);

         // Trata la información de la imagen para poder trasladarla al picturebox
         using (MemoryStream ms = new MemoryStream(imgData, 0, imgData.Length))
         {
            ms.Write(imgData, 0, imgData.Length);
            newImage = Image.FromStream(ms, true);
         }

         pictureBox2.Image = newImage;
         newImage = null;
      }
      else
      {
         MessageBox.Show("No existe registro con ese Id", "Búsqueda Nota", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
      }
   }
   catch(Exception ex)
   {
      MessageBox.Show(ex.Message);
   }
   finally
   {
      // Cierra la conexión si esta se encuentra abierta
      if (con.State == ConnectionState.Open)
         con.Close();
   }
}

Ejemplo

He preparado un pequeño ejemplo que puedes descargar con el código necesario para guardar y consultar una imagen en una base de datos SQL Server.

Ejemplo – Guardar Imagen Sql Server

Un comentario sobre “Guardar imagen en base de datos de SQL Server”

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s