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.

API Rest para almacenar imagen en base de datos con Entity Framework

Hola, he actualizado este artículo para hacer uso de Entity Framework.


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


6 respuestas a “Guardar imagen en base de datos de SQL Server”

  1. thanks!!!

    Me gusta

  2. el mismo procedimiento lo puedo usar para mostrar la imagen en un REPORTING (rdlc)

    Me gusta

    1. Hola, no lo he intentado. Puedes probar y nos comentas! 😉

      Me gusta

  3. Saludos, estoy tratando esto mismo, quiero guardar una imagen que llamo desde la base de datos de una tabla registro, y guardarla en otra tabla consulta, pero no he podido hacerla, podrias mostrar como hacer eso, guardar de una tabla a otra. espero tu respuesta. gracias

    Me gusta

    1. Hola, en estos momentos no tengo SQL Server instalado, por lo que no puedo corroborar si la solución es válida.

      Cuando lees el registro que contiene la imagen, se asigna el resultado en un arreglo de tipo byte. Este tipo de dato es el utilizado para guardar la imagen.

      // Al leer se obtiene un arreglo de bytes. Botón Consulta, línea 22
      byte[] imgData = (byte[])rdr.GetValue(1);

      // Para guardar la imagen, se envía como parámetro un arreglo de bytes. Botón guardar, línea 4
      byte[] data = System.IO.File.ReadAllBytes(txtRuta.Text);

      Me gusta

Deja una respuesta

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. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: