none
Agregar Imagen a DB ? RRS feed

  • Pregunta

  • Hola....

    Como puedo hacer para agregar imagenes a mi DB...Por ejemplo si mi DB se llama Contactos y sus Campos son

    Nombre,Apellido,Foto-----------Me imagino q debo programar dos botones ,el primero q me importe la imagen desde una carpeta donde esta previamente almacenada a una caja de imagen en mi formulario y otro q guarde a la DB............???

     

    GRACIAS


    EFRAIN MEJIAS C VALENCIA - VENEZUELA
    jueves, 17 de marzo de 2011 12:36

Respuestas

  • cree un articulo

    [WinForms] Edición Empleados – Grabar imagen en base de datos

    en donde podras ver como hacerlo en winforms

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 17 de marzo de 2011 13:29
  • Hola para poder insertar una iamgen en tu BD, tiens que convertir la imagen a binario.

    'Evento Click del botón guardar
     Using fs As New FileStream(Me.ruta_archivo, FileMode.Open) 'FileStream permite leer el archivo
          Dim datos(Convert.ToInt32(fs.Length)) As Byte
          fs.Read(datos, 0, Convert.ToInt32(fs.Length)) 'Los datos los guardamos en un arreglo de bytes.
          '
          'Sentencia SQL para grabar un nuevo documento.
          Dim sql As String = "INSERT INTO Documentos (documento) values (@nombre)" 
          Using cn As New SqlConnection("Server=.;database=Pruebas;integrated security=true")
            Using cmd As New SqlCommand(sql, cn)
              'Le pasamos el arreglo de bytes.
              cmd.Parameters.Add("@nombre", SqlDbType.Image).Value = datos
              cn.Open() 'Abrimos la conexion
              cmd.ExecuteNonQuery() ' Ejecutamos el Query.
            End Using
          End Using
        End Using 
    
    Ahi tiens un ejemplo, te doy el link donde obteni el ejemplo, es muy simple amigo. y cada linea de codigo esta detalladamente comentado para un entendimiento del mismo.
    http://eperedo.comze.com/2009/09/guardar-archivos-en-sql-server/
    viernes, 18 de marzo de 2011 17:30
  • Hola ...LUCHITO

    UNA preguntica ese codigo graba la imagen en el campo o agrega la direcion de origen.....gracias a mi me quedo asi

      private void button7_Click(object sender, EventArgs e)
            {
                string Cedula, Nombres, Apellidos, Sucursal;
                DateTime Fecha = dateTimePicker1.Value.Date;
                Cedula = textBox1.Text; Nombres = textBox2.Text; Apellidos = textBox3.Text; Sucursal = textBox4.Text;
                using (FileStream fs = new FileStream(path, FileMode.Open))
                {
                    //FileStream permite leer el archivo
                    byte[] datos = new byte[Convert.ToInt32(fs.Length) + 1];
                    fs.Read(datos, 0, Convert.ToInt32(fs.Length));
                    //Los datos los guardamos en un arreglo de bytes.
                    //
                    //Sentencia SQL para grabar un nuevo documento.
                    string sql =@"INSERT INTO Cliente VALUES (@Cedula,@Nombres,@Apellidos,@Sucursal,@Fecha,@Imagn)";
                    using (SqlConnection cn = new SqlConnection(@"Data Source=FABRIZIOSERVER1\SQLEXPRESS;Initial Catalog=Cliente;Integrated Security=True"))
                    {
                        using (SqlCommand cmd = new SqlCommand(sql, cn))
                        {
                            //Le pasamos el arreglo de bytes.
                            cmd.Parameters.AddWithValue("@Cedula", Cedula);
                            cmd.Parameters.AddWithValue("@Nombres", Nombres);
                            cmd.Parameters.AddWithValue("@Apellidos", Apellidos);
                            cmd.Parameters.AddWithValue("@Sucursal", Sucursal);
                            cmd.Parameters.AddWithValue("@Fecha", Fecha);
                            cmd.Parameters.Add("@Imagn", SqlDbType.Image).Value = datos;
                            cn.Open();
                            //Abrimos la conexion
                            cmd.ExecuteNonQuery();
                            // Ejecutamos el Query.
                        }
                    }
                }


       
            }
    EFRAIN MEJIAS C VALENCIA - VENEZUELA
    viernes, 18 de marzo de 2011 21:11

Todas las respuestas

  • Hola, podrías utilizar los ejemplos del blog de Leandro Tuttini, aunque este en asp.net hacerlo en ambiente windows es similar.

    http://ltuttini.blogspot.com/2010/03/aspnet-guardar-imagen-base-de-datos.html


    Lima-Perú
    jueves, 17 de marzo de 2011 13:11
  • cree un articulo

    [WinForms] Edición Empleados – Grabar imagen en base de datos

    en donde podras ver como hacerlo en winforms

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 17 de marzo de 2011 13:29
  • Hola

    Leandro muy bueno tu Blog....

    Escrbi este codigo

     private void button1_Click(object sender, EventArgs e)
            {
                try
                {

                    string Cedula, Nombres, Apellidos, Sucursal;
                    DateTime Fecha = dateTimePicker1.Value.Date ;
                    Cedula = textBox1.Text; Nombres = textBox2.Text; Apellidos = textBox3.Text; Sucursal = textBox4.Text;
                    Image Imagn = pictureBox1.Image;
                    SqlConnection cnx = new SqlConnection(@"Data Source=FABRIZIOSERVER1\SQLEXPRESS;Initial Catalog=Cliente;Integrated Security=True");
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = cnx;
                    cmd.Connection.Open();
                    cmd.CommandText = "INSERT INTO Cliente VALUES (@Cedula,@Nombres,@Apellidos,@Sucursal,@Fecha,@Imagn)";
                    cmd.Parameters.AddWithValue("@Cedula", Cedula);
                    cmd.Parameters.AddWithValue("@Nombres", Nombres);
                    cmd.Parameters.AddWithValue("@Apellidos",Apellidos);
                    cmd.Parameters.AddWithValue("@Sucursal",Sucursal);
                    cmd.Parameters.AddWithValue("@Fecha",Fecha);
                    cmd.Parameters.AddWithValue("@Imagn",Imagn);
                    cmd.ExecuteNonQuery();
                    cmd.Connection.Close();
                    cmd.Parameters.Clear();
                    MessageBox.Show("LOS DATOS FUERON REGISTRADOS CON EXITO " ,"LISTO");
                }
                catch (Exception Ex)
                {
                    MessageBox.Show("ERROR     " + Ex,"ADVERTENCIA");
                }
                
            }

     

    Y ME DA ESTE ERROR

    ---------------------------
    ADVERTENCIA
    ---------------------------
    ERROR     System.ArgumentException: No hay ninguna asignación de tipo de objeto System.Drawing.Bitmap a un tipo nativo de un proveedor administrado conocido.

       en System.Data.SqlClient.MetaType.GetMetaTypeFromValue(Type dataType, Object value, Boolean inferLen)

       en System.Data.SqlClient.SqlParameter.GetMetaTypeOnly()

       en System.Data.SqlClient.SqlParameter.Validate(Int32 index, Boolean isCommandProc)

       en System.Data.SqlClient.SqlCommand.BuildParamList(TdsParser parser, SqlParameterCollection parameters)

       en System.Data.SqlClient.SqlCommand.BuildExecuteSql(CommandBehavior behavior, String commandText, SqlParameterCollection parameters, _SqlRPC& rpc)

       en System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)

       en System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)

       en System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)

       en System.Data.SqlClient.SqlCommand.ExecuteNonQuery()

       en BdCnSQL2008.Form1.button1_Click(Object sender, EventArgs e) en C:\Users\FabrizioServers\Documents\Visual Studio 2008\Projects\BdCnSQL2008\BdCnSQL2008\Form1.cs:línea 42
    ---------------------------
    Aceptar  
    ---------------------------


    EFRAIN MEJIAS C VALENCIA - VENEZUELA
    viernes, 18 de marzo de 2011 13:34
  • hola .....Este medice q tengo que declarar la variable escalar "@Imgn"

    private void button1_Click(object sender, EventArgs e)

    {

     

    try

     

    {

     

    string Cedula, Nombres, Apellidos, Sucursal;

     

    DateTime Fecha = dateTimePicker1.Value.Date ;

    Cedula = textBox1.Text; Nombres = textBox2.Text; Apellidos = textBox3.Text; Sucursal = textBox4.Text;

     

    Image Imagn = pictureBox1.Image;

     

    SqlConnection cnx = new SqlConnection(@"Data Source=FABRIZIOSERVER1\SQLEXPRESS;Initial Catalog=Cliente;Integrated Security=True");

     

    SqlCommand cmd = new SqlCommand();

    cmd.Connection = cnx;

    cmd.Connection.Open();

    cmd.CommandText =

    "INSERT INTO Cliente VALUES (@Cedula,@Nombres,@Apellidos,@Sucursal,@Fecha,@Imagn)";

    cmd.Parameters.AddWithValue(

    "@Cedula", Cedula);

    cmd.Parameters.AddWithValue(

    "@Nombres", Nombres);

    cmd.Parameters.AddWithValue(

    "@Apellidos",Apellidos);

    cmd.Parameters.AddWithValue(

    "@Sucursal",Sucursal);

    cmd.Parameters.AddWithValue(

    "@Fecha",Fecha);

     

    SqlParameter ImageParam = new SqlParameter ("@Imagn", System.Data.SqlDbType.Image);

    ImageParam.Value = Imagn;

    cmd.ExecuteNonQuery();

    cmd.Connection.Close();

    cmd.Parameters.Clear();

     

    MessageBox.Show("LOS DATOS FUERON REGISTRADOS CON EXITO " ,"LISTO");

    }

     

    catch (Exception Ex)

    {

     

    MessageBox.Show("ERROR " + Ex,"ADVERTENCIA");

    }

     

    }


    EFRAIN MEJIAS C VALENCIA - VENEZUELA
    viernes, 18 de marzo de 2011 17:07
  • Hola para poder insertar una iamgen en tu BD, tiens que convertir la imagen a binario.

    'Evento Click del botón guardar
     Using fs As New FileStream(Me.ruta_archivo, FileMode.Open) 'FileStream permite leer el archivo
          Dim datos(Convert.ToInt32(fs.Length)) As Byte
          fs.Read(datos, 0, Convert.ToInt32(fs.Length)) 'Los datos los guardamos en un arreglo de bytes.
          '
          'Sentencia SQL para grabar un nuevo documento.
          Dim sql As String = "INSERT INTO Documentos (documento) values (@nombre)" 
          Using cn As New SqlConnection("Server=.;database=Pruebas;integrated security=true")
            Using cmd As New SqlCommand(sql, cn)
              'Le pasamos el arreglo de bytes.
              cmd.Parameters.Add("@nombre", SqlDbType.Image).Value = datos
              cn.Open() 'Abrimos la conexion
              cmd.ExecuteNonQuery() ' Ejecutamos el Query.
            End Using
          End Using
        End Using 
    
    Ahi tiens un ejemplo, te doy el link donde obteni el ejemplo, es muy simple amigo. y cada linea de codigo esta detalladamente comentado para un entendimiento del mismo.
    http://eperedo.comze.com/2009/09/guardar-archivos-en-sql-server/
    viernes, 18 de marzo de 2011 17:30
  • hola .....Este medice q tengo que declarar la variable escalar "@Imgn"

    {

     

     

     

    SqlParameter ImageParam = new SqlParameter ("@Imagn", System.Data.SqlDbType.Image);

    ImageParam.Value = Imagn;

    te falta agregarle el parámetro , algo asi

    cmd.Parameters.Add(ImageParam);


    Lima-Perú
    • Propuesto como respuesta Augusto1982 viernes, 18 de marzo de 2011 21:13
    viernes, 18 de marzo de 2011 17:33
  • Hola ...LUCHITO

    UNA preguntica ese codigo graba la imagen en el campo o agrega la direcion de origen.....gracias a mi me quedo asi

      private void button7_Click(object sender, EventArgs e)
            {
                string Cedula, Nombres, Apellidos, Sucursal;
                DateTime Fecha = dateTimePicker1.Value.Date;
                Cedula = textBox1.Text; Nombres = textBox2.Text; Apellidos = textBox3.Text; Sucursal = textBox4.Text;
                using (FileStream fs = new FileStream(path, FileMode.Open))
                {
                    //FileStream permite leer el archivo
                    byte[] datos = new byte[Convert.ToInt32(fs.Length) + 1];
                    fs.Read(datos, 0, Convert.ToInt32(fs.Length));
                    //Los datos los guardamos en un arreglo de bytes.
                    //
                    //Sentencia SQL para grabar un nuevo documento.
                    string sql =@"INSERT INTO Cliente VALUES (@Cedula,@Nombres,@Apellidos,@Sucursal,@Fecha,@Imagn)";
                    using (SqlConnection cn = new SqlConnection(@"Data Source=FABRIZIOSERVER1\SQLEXPRESS;Initial Catalog=Cliente;Integrated Security=True"))
                    {
                        using (SqlCommand cmd = new SqlCommand(sql, cn))
                        {
                            //Le pasamos el arreglo de bytes.
                            cmd.Parameters.AddWithValue("@Cedula", Cedula);
                            cmd.Parameters.AddWithValue("@Nombres", Nombres);
                            cmd.Parameters.AddWithValue("@Apellidos", Apellidos);
                            cmd.Parameters.AddWithValue("@Sucursal", Sucursal);
                            cmd.Parameters.AddWithValue("@Fecha", Fecha);
                            cmd.Parameters.Add("@Imagn", SqlDbType.Image).Value = datos;
                            cn.Open();
                            //Abrimos la conexion
                            cmd.ExecuteNonQuery();
                            // Ejecutamos el Query.
                        }
                    }
                }


       
            }
    EFRAIN MEJIAS C VALENCIA - VENEZUELA
    viernes, 18 de marzo de 2011 21:11
  • Hola Efrain de nuevo. Soy Luchito solo que cambie el nombre de mi perfil jaja. Bueno este codigo grabar la imagen en un campo de tipo Image en una BD SQL SERVER, tranquilamente se pudo haber grabado la ruta como dices, Sin embargo las dos opciones son validas y cada uno tiene sus ventajas y desventajas que paso a nombrarte a continuacion y ya tu con tu analisis y atarves de tus requerimientos que se te presentan buscaras y daras solución a tu problema.

    GRABAR RUTA EN TU BD.

    Ventajas: La principal ventaja  es el espacio de almacenamiento, ya que solo guardaras texto  del directorio donde se encuentre tu foto u archivo. Ejm (D:\fotos/1.jpg). En cambio si guardas el binario uff.. ocupara mas espacio sin lugar a dudas.

    DESVENTAJAS: La desventaja es que tu archivo se puede borrar de ese directorio, se puede dar el caso que por x motivos tu archivo se puede dañar o alguien lo elimina. y si este se elimina tu BD tendra la ruta del directorio, entonces cuando kieras accesar a el desde codigo no obtendras el archivo o foto.

     

    GRABAR IMAGEN EN TIPO DE DATOS IMAGE

    Ventajas: La ventaja es el que no interesa si se elimina el archivo del directorio, ya que al estar almacenado como binario, puedes acceder a el tranquilamente desde el codigo .NET.

    Otra ventaja de usar tipo de datos Image, es poder almacenar, peliculas enteras, musica, planos, contrators importantes, fotos,  huellas digitales, todo esto sin preocuparte que alguien borre o se borre de casualidad

     

    Desventaja: La desventaja seria el tamaño que ocupa este tipo de dato en tu BD, ya que este tipo de dato esta pensado para almacenar archivos grandes, y a veces una mala de desicion en usar este tipo de dato puede llevar a tener una BD demasidad pesada cuando en realidad no era necesaria usar tipo de datos BLOB.

    Antes de pensar cual de las dos maneras usar, debes analizar bien la situacion y poensar si realmente vale la pena usar tipo de datos IMAGE.

     

    Saludos desde Trujillo-Perú.

     

     


    viernes, 18 de marzo de 2011 23:29
  • Hola ...........esta es otra forma tambien lo hace perfecto....

     try
                {

                    string Cedula, Nombres, Apellidos, Sucursal;
                    DateTime Fecha = dateTimePicker1.Value.Date ;
                    Cedula = textBox1.Text; Nombres = textBox2.Text; Apellidos = textBox3.Text; Sucursal = textBox4.Text;
                    Image Imagn = pictureBox1.Image;
                  
                    SqlConnection cnx = new SqlConnection(@"Data Source=FABRIZIOSERVER1\SQLEXPRESS;Initial Catalog=Cliente;Integrated Security=True");
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = cnx;
                    cmd.Connection.Open();
                    cmd.CommandText = "INSERT INTO Cliente VALUES (@Cedula,@Nombres,@Apellidos,@Sucursal,@Fecha,@Imagn)";
                    cmd.Parameters.AddWithValue("@Cedula", Cedula);
                    cmd.Parameters.AddWithValue("@Nombres", Nombres);
                    cmd.Parameters.AddWithValue("@Apellidos",Apellidos);
                    cmd.Parameters.AddWithValue("@Sucursal",Sucursal);
                    cmd.Parameters.AddWithValue("@Fecha",Fecha);
                   
                    SqlParameter ImageParam = cmd.Parameters .Add ("@Imagn",System.Data.SqlDbType.Image);
                    ImageParam.Value = imageToByteArray(Imagn);
                   
                    cmd.ExecuteNonQuery();
                    cmd.Connection.Close();
                    cmd.Parameters.Clear();
                    MessageBox.Show("LOS DATOS FUERON REGISTRADOS CON EXITO " ,"LISTO");
                }
                catch (Exception Ex)
                {
                    MessageBox.Show("ERROR     " + Ex,"ADVERTENCIA");
                }
                 
            }
    EFRAIN MEJIAS C VALENCIA - VENEZUELA
    sábado, 19 de marzo de 2011 14:10
  • Hay varias formas, lo importante es que tengas tu propia logica de trabajo, si nno me equivoco esa forma la usa Leandro Tuttini. Usa una clase Helper que tienen metodos staticos que te hacen el proceso de convertir una imagen a un Array de Bytes para poder registyrarlo en un campo e tipo Image.

    Y el otro metodo es ala inversa convertir un Array de Bytes a un Image, para poder visualizarlo en un PictureBox o una columna de una Grilla.

    Igual debes de ver las ventaajs y desventajas de usar, que explique en mi post anterior.

    Suerte y exitos en tu Proyecto.

    Saludos desde Trujillo-Perú.


    Programador .NET - Desarrollador 5 Estrellas.
    sábado, 19 de marzo de 2011 14:45