Test Foro de elhacker.net SMF 2.1

Programación => Programación General => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: diego_lp en 1 Enero 2010, 17:02 PM

Título: [SOLUCIONADO]Insertar imagen en access
Publicado por: diego_lp en 1 Enero 2010, 17:02 PM
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
Título: Re: Insertar imagen en access
Publicado por: Shell Root en 1 Enero 2010, 20:29 PM
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!
Título: Re: Insertar imagen en access
Publicado por: diego_lp en 3 Enero 2010, 21:43 PM
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  ;-)