2010-08-23 29 views
20

Quiero guardar la imagen del usuario en una base de datos en C#. ¿Cómo puedo hacer eso?Cómo guardar imágenes en la base de datos usando C#

+0

Eche un vistazo a: http: // stackoverflow.com/questions/744589/how-do-you-store-a-picture-in-an-image-column/744603 # 744603 – Canavar

+0

Posible duplicado de [¿Cómo guardar la imagen en la base de datos y mostrarla en Views in MVC 4?] (http://stackoverflow.com/questions/20825119/how-to-save-image-in-database-and-display-it-into-views-in-mvc-4) –

Respuesta

4

usted querrá convertir la imagen a un byte[] en C#, y entonces tendrá la columna de la base de datos como varbinary(MAX)

Después de eso, es como guardar cualquier otro tipo de datos.

2

puede guardar la ruta de la imagen en la base de datos o guardarla como un BLOB (binario - array de bytes) .. depende del caso que tenga, si su aplicación es una aplicación web, luego guarde la ruta de la imagen es mucho mejor. Pero si tiene una aplicación basada en el cliente que se conecta a una base de datos centralizada, debe guardarla como binaria.

+0

Esto debe ser un comentario. El usuario pide otra cosa. Si tiene una crítica al método, por favor use un comentario. –

3

Este es un método que utiliza un control FileUpload en asp.net:

byte[] buffer = new byte[fu.FileContent.Length]; 
Stream s = fu.FileContent; 
s.Read(buffer, 0, buffer.Length); 
//Then save 'buffer' to the varbinary column in your db where you want to store the image. 
1

Puesto que usted está utilizando SQL, recomendaría contra el uso de adhoc ('declaraciones de escritura en cadenas'), especialmente teniendo en cuenta que son cargando una imagen.

ADO.NET puede hacer todo el trabajo arduo de mapeo, escape, etc. para usted.

Cree un Procedimiento almacenado o utilice SqlParameter para realizar la vinculación.

Como dicen los otros carteles, use VARBINARY (MAX) como su tipo de almacenamiento - IMAGE está siendo depracated.

18

Pruebe este método. Debería funcionar cuando el campo cuando desea almacenar la imagen es del tipo bytea. Primero crea byte[] para la imagen. Luego lo guarda DB usando IDataParameter del tipo binary.

public static void PerisitImage(string path, IDbConnection connection) 
    { 
     using (var command = connection.CreateCommand()) 
     { 
      Image img = Image.FromFile (path); 
      MemoryStream tmpStream = new MemoryStream(); 
      img.Save (tmpStream, ImageFormat.Png); // change to other format 
      tmpStream.Seek (0, SeekOrigin.Begin); 
      byte[] imgBytes = new byte[MAX_IMG_SIZE]; 
      tmpStream.Read (imgBytes, 0, MAX_IMG_SIZE); 

      command.CommandText = "INSERT INTO images(payload) VALUES (:payload)"; 
      IDataParameter par = command.CreateParameter(); 
      par.ParameterName = "payload"; 
      par.DbType = DbType.Binary; 
      par.Value = imgBytes; 
      command.Parameters.Add(par); 
      command.ExecuteNonQuery(); 
     } 
    } 
+3

Para aquellos que lean esto más adelante, 'DbType.Binary' maneja' varbinary (MAX) 'aunque la ayuda sobre herramientas dice que está limitado a 8000 bytes. –

2

Mi preferencia personal no es guardar las imágenes en una base de datos como tal. Guarde la imagen en algún lugar del sistema de archivos y guarde una referencia en la base de datos.

+2

Solo es útil en algunos casos, ya que tiene que hacer que el sistema de archivos en cuestión se abra a todo el código .NET. También es inconsistente. Puede ser lo suficientemente útil en aplicaciones web, siempre y cuando no necesites expandirte a una webfarma, momento en el que compartir los archivos puede ser una molestia. –

+1

puede usar el SQL http://msdn.microsoft.com/en-us/library/cc949109.aspx - también disponible en nHIbernate desde 2.1 http://zvolkov.com/blog/post/2009/07/20/ Whats-new-in-NHibernate-21.aspx serilaizing en la base de datos no es una buena estrategia de diseño - tener que establecer permisos en una carpeta no es una buena razón para no hacerlo correctamente :) – iwayneo

+0

@cvista Guardo las imágenes en la base de datos frecuentemente. Coloque una instancia de Memcached en la mezcla y se vuelve aún más atractivo. – Ryan

-4
//Arrange the Picture Of Path.*** 

    if (openFileDialog1.ShowDialog() == DialogResult.OK) 
       { 
        pictureBox1.Image = Image.FromFile(openFileDialog1.FileName); 

        string[] PicPathArray; 
        string ArrangePathOfPic; 

        PicPathArray = openFileDialog1.FileName.Split('\\'); 

        ArrangePathOfPic = PicPathArray[0] + "\\\\" + PicPathArray[1]; 
        for (int a = 2; a < PicPathArray.Length; a++) 
        { 
         ArrangePathOfPic = ArrangePathOfPic + "\\\\" + PicPathArray[a]; 
        } 
       } 

// Save the path Of Pic in database 

        SqlConnection con = new SqlConnection("Data Source=baqar-pc\\baqar;Initial Catalog=Prac;Integrated Security=True"); 
        con.Open(); 

        SqlCommand cmd = new SqlCommand("insert into PictureTable (Pic_Path) values (@Pic_Path)", con); 
        cmd.Parameters.Add("@Pic_Path", SqlDbType.VarChar).Value = ArrangePathOfPic; 

        cmd.ExecuteNonQuery(); 

***// Get the Picture Path in Database.*** 

SqlConnection con = new SqlConnection("Data Source=baqar-pc\\baqar;Initial Catalog=Prac;Integrated Security=True"); 
       con.Open(); 

       SqlCommand cmd = new SqlCommand("Select * from Pic_Path where ID = @ID", con); 

       SqlDataAdapter adp = new SqlDataAdapter(); 
       cmd.Parameters.Add("@ID",SqlDbType.VarChar).Value = "1"; 
       adp.SelectCommand = cmd; 

       DataTable DT = new DataTable(); 

       adp.Fill(DT); 

       DataRow DR = DT.Rows[0]; 
       pictureBox1.Image = Image.FromFile(DR["Pic_Path"].ToString()); 
-1

Creo que esta pregunta válida ya está respondida aquí. Lo he intentado también. Mi problema era simplemente usar la edición de imágenes (desde DevExpress). y así es como llegué a su alrededor:

  • Cambio del PictureEdit propiedad "PictureStoreMode" a ByteArray: está establecido actualmente en "default" enter image description here
  • convertir el valor de edición del control para bye: byte [ ] newImg = (byte []) pictureEdit1.EditValue;
  • guardar la imagen: this.tbSystemTableAdapter.qry_updateIMGtest (newImg);

Gracias de nuevo. Chagbert

Cuestiones relacionadas