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.
thanks!!!
Me gustaMe gusta
fack
Me gustaMe gusta
el mismo procedimiento lo puedo usar para mostrar la imagen en un REPORTING (rdlc)
Me gustaMe gusta
Hola, no lo he intentado. Puedes probar y nos comentas! 😉
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta