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;
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
ResponderEliminarY 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.
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminar