Imagenes en Access con C#

Hola amigos, aqui les dejo una publicación sobre como grabar imagenes en una base de datos Access. Es bien fácil, aqui les dejo el ejemplo.

Aqui les muestro la estructura de la tabla en Access



Y éste es el código:

class ImagenesAccess
{
string _connStr = "Provider=Microsoft.Jet.OLEDB.4.0;"+
"Data Source=" + Application.StartupPath + "\\IMG.mdb";
public string ConnStr {
get {
return _connStr;
}
set {
_connStr = value;
}
}
public bool GuardarImagen(byte[] abImagen)
{
OleDbConnection conn = new OleDbConnection(_connStr);
OleDbCommand comm = new
OleDbCommand("INSERT INTO imagenes (imagen) VALUES (?)", conn);
OleDbParameter parImagen = new OleDbParameter("@imagen",
OleDbType.VarBinary, abImagen.Length);
parImagen.Value = abImagen;
comm.Parameters.Add(parImagen);
conn.Open();
int iResultado = comm.ExecuteNonQuery();
conn.Close();
return Convert.ToBoolean(iResultado);
}
public byte[] ObtenerImagen(int iImageID)
{
OleDbConnection conn = new OleDbConnection(_connStr);
OleDbCommand comm = new OleDbCommand("SELECT ID,imagen "+
" FROM imagenes where ID=" + iImageID + "" , conn);
conn.Open();
OleDbDataReader dr = null;
dr = comm.ExecuteReader();
byte[] aBytes = null;
if (dr.Read())
{
aBytes = (byte[])dr.GetValue(1);
iImageID = dr.GetInt32(0);
}
conn.Close();
dr.Close();
return (aBytes);
}
}


Esta clase utiliza las directivas (using):

using System;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;


Ahora veamos como utilizar la clase:

Si queremos insertar una imagen, utilicemos un código como el siguiente:

string CnnStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + Application.StartupPath + "\\IMG.mdb";
private void btnSubirImagen_Click(object sender, EventArgs e){
OpenFileDialog m_OpenFile = new OpenFileDialog();
m_OpenFile.InitialDirectory = Application.ExecutablePath.ToString();
m_OpenFile.Title = "Buscar Imágenes";
m_OpenFile.Filter = "Todos los archivos(*.*)*.*"+
"Imagenes JPG (*.jpg)*.jpg"+
"Imagenes GIF (*.gif)*.gif";
m_OpenFile.FilterIndex = 2;
if (m_OpenFile.ShowDialog() == DialogResult.OK) {
System.IO.FileStream fs = new FileStream(m_OpenFile.FileName,
FileMode.Open, FileAccess.Read);
System.IO.BinaryReader br = new System.IO.BinaryReader(fs);
byte[] abImagen = new byte[fs.Length];
br.Read(abImagen, 0, (int)fs.Length);
br.Close();
fs.Close();
Class.ImagenesAccess _ImagenesAccess = new Class.ImagenesAccess();
if (_ImagenesAccess.GuardarImagen(abImagen)) {
MessageBox.Show("Imagen almacenada");
}
}
}


Si queremos recuperar la imagen y mostrarla en un picture box:

Class.ImagenesAccess _ImagenesAccess = new Class.ImagenesAccess();
byte[] img = _ImagenesAccess.ObtenerImagen(varID);//aqui el ID
if (img != null)
{ //Transformar los bytes en una imagen de nuevo
MemoryStream ms = new MemoryStream();
ms.Write(img, 0, img.GetUpperBound(0) + 1);
picImagen.Image = System.Drawing.Image.FromStream(ms);
ms.Close();
}


Espacios de nombres utilizamos:

using System.IO;
using System.Drawing;

3 comentarios:

  1. Una disculpa a mi ignorancia, Pero... ¿Cómo aplico este código a mi base de datos de Access 2003? mi correo: cebreros@prodigy.net.mx

    ResponderEliminar
  2. Y si el campo es de tipo "Archivo Adjunto" ¿cómo podemos añadir archivos variados a un solo campo de este tipo en access 2016? Se trata de un campo multivaluado disponible en las últimas versiones de access, y desde c# no puedo insertar esta clase de ficheros en un campo de este tipo.

    ResponderEliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar