none
Agregar una imagen a un registro de base de datos RRS feed

  • Pregunta

  • Tengo una tabla que forma parte de una base de datos, mi pregunta es como puedo hacer para que en la base se guarde la imagen?

    Ojala que me pudieran ayudar, muchas gracias!

    jueves, 11 de noviembre de 2010 19:09

Respuestas

  • Raul, ¿en que lenguaje esta desarrollado la aplicación desde donde enviaras la imagen?

    Personalmente utilizo tipo de datos VARBINARY(MAX) en SQL Server para almacenar las imagenes.

    Utilizo este metodo que convierte la imagen en un dato tipo Byte:

     byte
    
    [] ReadFile(string
    
     sPath)
      {
       byte
    
    [] data = null
    
    ;
    
       FileInfo fInfo = new
    
     FileInfo(sPath);
       long
    
     numBytes = fInfo.Length;
    
       FileStream fStream = new
    
     FileStream(sPath, FileMode.Open, FileAccess.Read);
    
       BinaryReader br = new
    
     BinaryReader(fStream);
    
       data = br.ReadBytes((int
    
    )numBytes);
    
       return
    
     data;
      }
    
    El parametro que recibe "sPath" es el nombre de la imagen con ruta (Ejemplo: C:\imagen.jpg)

    Para insertarlo en SQL Server utilizo:

    cmd.CommandText = "INSERT INTO IMAGENES_CLIENTES VALUES(@idCliente, @fotografia)"
    
    ;
    
    cmd.Parameters.AddWithValue("@idCliente"
    
    , identificacion);
    cmd.Parameters.AddWithValue("@fotografia"
    
    , fotografia);
    
    //La variable fotografia es tipo byte
    
    
    
    Donde la variable fotografia tipo byte es el resultado de la conversión que hacemos con el metodo anterior.



    En tu caso usa un Query como este, directamente desde SQL Server:

    INSERT INTO <tabla> (Imagen)
    SELECT BulkColumn FROM OPENROWSET(
    Bulk 'C:\imagenes\imagen.jpg', SINGLE_BLOB) AS Imagen
    



    Espero que te orientes con esto.

    Willy Taveras.-

    http://itlearn.net

    jueves, 11 de noviembre de 2010 20:10
    Moderador
  • Mi aplicacion es en c#

    Ese código es en C#, puedes utilizarlo.

    También puedes utilizar esto:

    create table imagenes( imagen varbinary(max))
    
    INSERT INTO imagenes (imagen)
    SELECT BulkColumn FROM OPENROWSET(Bulk 'C:\Invierno.jpg', SINGLE_BLOB) AS Imagen
    
    

    Willy Taveras.-

    http://itlearn.net

    • Marcado como respuesta r4ul90 viernes, 12 de noviembre de 2010 1:23
    jueves, 11 de noviembre de 2010 20:17
    Moderador
  • No, si lo pones tipo varbinary(MAX), utiliza este metodo para traerlas como imagenes:


    public Image CargarImagen(int idCliente)
    {
          var ds = new DataSet();
          
    	  con.Open();
     	  cmd.CommandText = "SELECT Imagen FROM Imagenes WHERE IdCliente = @idCliente";
          cmd.Parameters.AddWithValue("@idCliente", idCliente)
    
    
          var adapter = new SqlDataAdapter(Command);
     	  adapter.Fill(ds, "Imagenes");
    
          con.Close();
    
          var imageData = (byte[])ds.Tables["Imagenes"].Rows[0]["Imagen"];
          Image newImage;
    
          using (var ms = new MemoryStream(imageData, 0, imageData.Length))
          {
            ms.Write(imageData, 0, imageData.Length);
            newImage = Image.FromStream(ms, true);
          }      
    
          return newImage;
    }
    


    Si estas utilizando un PictureBox para mostrar la imagen solo tienes que poner:

    pictureBox1.Image = this.CargarImagen(idCliente) //Envias por parametro el IdCliente
    
    
    

    Espero que te sirva.






    Willy Taveras.-

    http://itlearn.net

    jueves, 11 de noviembre de 2010 20:36
    Moderador

Todas las respuestas

  • Hola raul

    Cuentanos a que te refieres con imagen, es decir una imagen de mapa de bits, un jpg, o una imagen de la tabla como tal ?


    DIEGO FERNANDO NICOLS ARIZALA
    jueves, 11 de noviembre de 2010 19:35
  • Por imagen me refiero a un archivo jpeg. Me gustaria saber como guardarlo directamente en la base de datos, es decir sin tener que usar una aplicacion de por medio, solo con sql server management studio y si fuera necesario TSQL
    jueves, 11 de noviembre de 2010 19:40
  • Raul, ¿en que lenguaje esta desarrollado la aplicación desde donde enviaras la imagen?

    Personalmente utilizo tipo de datos VARBINARY(MAX) en SQL Server para almacenar las imagenes.

    Utilizo este metodo que convierte la imagen en un dato tipo Byte:

     byte
    
    [] ReadFile(string
    
     sPath)
      {
       byte
    
    [] data = null
    
    ;
    
       FileInfo fInfo = new
    
     FileInfo(sPath);
       long
    
     numBytes = fInfo.Length;
    
       FileStream fStream = new
    
     FileStream(sPath, FileMode.Open, FileAccess.Read);
    
       BinaryReader br = new
    
     BinaryReader(fStream);
    
       data = br.ReadBytes((int
    
    )numBytes);
    
       return
    
     data;
      }
    
    El parametro que recibe "sPath" es el nombre de la imagen con ruta (Ejemplo: C:\imagen.jpg)

    Para insertarlo en SQL Server utilizo:

    cmd.CommandText = "INSERT INTO IMAGENES_CLIENTES VALUES(@idCliente, @fotografia)"
    
    ;
    
    cmd.Parameters.AddWithValue("@idCliente"
    
    , identificacion);
    cmd.Parameters.AddWithValue("@fotografia"
    
    , fotografia);
    
    //La variable fotografia es tipo byte
    
    
    
    Donde la variable fotografia tipo byte es el resultado de la conversión que hacemos con el metodo anterior.



    En tu caso usa un Query como este, directamente desde SQL Server:

    INSERT INTO <tabla> (Imagen)
    SELECT BulkColumn FROM OPENROWSET(
    Bulk 'C:\imagenes\imagen.jpg', SINGLE_BLOB) AS Imagen
    



    Espero que te orientes con esto.

    Willy Taveras.-

    http://itlearn.net

    jueves, 11 de noviembre de 2010 20:10
    Moderador
  • Mi aplicacion es en c#
    jueves, 11 de noviembre de 2010 20:16
  • Mi aplicacion es en c#

    Ese código es en C#, puedes utilizarlo.

    También puedes utilizar esto:

    create table imagenes( imagen varbinary(max))
    
    INSERT INTO imagenes (imagen)
    SELECT BulkColumn FROM OPENROWSET(Bulk 'C:\Invierno.jpg', SINGLE_BLOB) AS Imagen
    
    

    Willy Taveras.-

    http://itlearn.net

    • Marcado como respuesta r4ul90 viernes, 12 de noviembre de 2010 1:23
    jueves, 11 de noviembre de 2010 20:17
    Moderador
  • Se puede utilizar este metodo con una columna de tipo image? O tendria que cambiar el tipo a varbinary(max)? Hasta donde se si uso image puedo ver en el datagridview la imagen... Si lo cambio a varbinary max, veria solo el binario en el datagrid cierto?
    jueves, 11 de noviembre de 2010 20:26
  • No, si lo pones tipo varbinary(MAX), utiliza este metodo para traerlas como imagenes:


    public Image CargarImagen(int idCliente)
    {
          var ds = new DataSet();
          
    	  con.Open();
     	  cmd.CommandText = "SELECT Imagen FROM Imagenes WHERE IdCliente = @idCliente";
          cmd.Parameters.AddWithValue("@idCliente", idCliente)
    
    
          var adapter = new SqlDataAdapter(Command);
     	  adapter.Fill(ds, "Imagenes");
    
          con.Close();
    
          var imageData = (byte[])ds.Tables["Imagenes"].Rows[0]["Imagen"];
          Image newImage;
    
          using (var ms = new MemoryStream(imageData, 0, imageData.Length))
          {
            ms.Write(imageData, 0, imageData.Length);
            newImage = Image.FromStream(ms, true);
          }      
    
          return newImage;
    }
    


    Si estas utilizando un PictureBox para mostrar la imagen solo tienes que poner:

    pictureBox1.Image = this.CargarImagen(idCliente) //Envias por parametro el IdCliente
    
    
    

    Espero que te sirva.






    Willy Taveras.-

    http://itlearn.net

    jueves, 11 de noviembre de 2010 20:36
    Moderador