[SOLUCIONADO]Insertar imagen en access

Iniciado por diego_lp, 1 Enero 2010, 17:02 PM

0 Miembros y 1 Visitante están viendo este tema.

diego_lp

Hola gente, estoy intentando guardar una imagen en access para usarla en un crystal report, segun tengo entendido cystal report no soporta imagenes directamente por lo que tienen que estar en formato byte(), eh logrado convertir una imagen en byte pero no logro insertarla en mi base de datos, alguien me puede ayudar?
Bueno gracias, saludos.
Ah y feliz año!  ;D
Los programadores hicimos un pacto con Dios, él no hace sistemas y nosotros no hacemos milagros!

Shell Root

#1
Guardando imágenes en la BD



Para almacenar una imagen en la base de datos, hemos de leer el archivo que la contiene en forma de stream binario. Para ello, utilizamos la clase BinaryReader, con la que a partir de un objeto FileStream podremos obtener los bytes que forman el archivo. En la aplicación de ejemplo, tras pulsar el botón "Guardar Imagen en BD" y elegir un archivo de tipo bmp, jpg o gif, se ejecuta el siguiente código (en la función btnGuardar_Click de frmImagenes):

VB
Dim fs As System.IO.FileStream = New FileStream(ofdDataBase.FileName, FileMode.Open, FileAccess.Read)
Dim br As New System.IO.BinaryReader(fs)
Dim abImagen As Byte() = New Byte(fs.Length - 1) {}
br.Read(abImagen, 0, CInt(fs.Length))
br.Close()
fs.Close()


C#
System.IO.FileStream fs=new FileStream(ofdDataBase.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();


En primer lugar se crea un objeto FileStream apuntando al fichero que hemos seleccionado. Sobre este objeto se crea un  BinaryReader, con el que podremos leer los bytes del la imagen y almacenarlos en un array de bytes (abImagen) del mismo tamaño que el fichero. Este array es el que enviamos a la clase DBAccess  para ser almacenado mediante el método GuardarImagen:

VB
Public Function GuardarImagen(ByVal abImagen As Byte()) As Boolean
    Dim comm As New OleDbCommand("INSERT INTO imagenes (imagen) VALUES (?)", conn)
    Dim parImagen As New OleDbParameter("@imagen", OleDbType.VarBinary, abImagen.Length)
    parImagen.Value = abImagen
    comm.Parameters.Add(parImagen)
    conn.Open()
    Dim iResultado As Integer = comm.ExecuteNonQuery()
    conn.Close()
    Return Convert.ToBoolean(iResultado)
End Function


C#
public  bool GuardarImagen(byte  [] abImagen){
  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);
}


En este método, creamos un nuevo objeto OleDbCommand para ejecutar la INSERT en la base de datos. El parámetro que precisamos enviar es el array de bytes, por lo que en el tipo de dato del parámetro indicamos VarBinary (datos binarios de longitud variable).

La función devuelve un tipo booleano indicando si se ha efectuado o no la inserción en la base de datos. Como he comentado más arriba, no hay ningún tipo de control de errores en esta aplicación de ejemplo, algo que es indispensable en una real.

Fuente: http://www.elguille.info/colabora/puntoNET/mack_imagenesAccess.htm

Saludines!
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

diego_lp

Muchas gracias Shell Root
Había encontrado ese mismo en lace buscando en google pero no había logrado pasarlo correctamente del todo a visual basic y que esta todo en C#  :D
Ahora si pude.
Problema resuelto.
Muchas gracias  ;-)
Los programadores hicimos un pacto con Dios, él no hace sistemas y nosotros no hacemos milagros!