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
Deja una respuesta