none
Guardar y consultar imagenes almacenadas en sql tipo de dato Image RRS feed

  • Pregunta

  • Buenos dias, tengo un campo tipo de dato Image en sql que inserto imagenes de la siguiente manera:

     public static int ModificarImagen(Productos pProducto, int pidProducto)
            {
                int retorno = 0;
                using (SqlConnection conexion = Conexion.Ruta())
                {
                    SqlCommand comando = new SqlCommand(string.Format("Update productos set  Imagen='{1}' where idProducto={0}",
                         pProducto.idProducto, pProducto.Imagen,  pidProducto), conexion);

                    retorno = comando.ExecuteNonQuery();
                    conexion.Close();
                }
                return retorno;

            }

     xx.Codigo.Productos pProducto = new xx.Codigo.Productos();
                    pProducto.idProducto = Convert.ToInt32(lblidProducto.Text);
                    pProducto.Imagen = pictureBox1.Image;
                    if (xx.Codigo.Productos.ModificarImagen(pProducto, pProducto.idProducto) > 0)
             

    y cuando quiero consultar de la siguiente manera:

     SqlConnection xn = Conexion.Ruta();
                SqlCommand consultar = new SqlCommand("SELECT Imagen FROM productos WHERE idProducto=1", xn);
                SqlDataAdapter dp = new SqlDataAdapter(consultar);
                DataSet Cima = new DataSet("productos");

                byte[] datos = new byte[0];
                dp.Fill(Cima, "productos");
                DataRow Dr = Cima.Tables["productos"].Rows[0];
                datos = (byte[])Dr["Imagen"];
                MemoryStream ms = new MemoryStream(datos);
                this.pictureBox1.Image = Image.FromStream(ms);

    Me da siempre el mismo error que es: Se produjo una excepción de tipo 'System.ArgumentException' en System.Drawing.dll pero no se controló en el código del usuario

    Información adicional: El parámetro no es válido.

    Alguien sabe por que motivo es? Esta guardando mal la imagen?

    Saludos

    miércoles, 10 de junio de 2020 13:46

Todas las respuestas

  • Hay un error en el Update. Tal como lo tienes, está grabando "basura" en el campo Image (concretamente grabará algo así como el texto "System.Drawing.Image").

    Cuando lo lees y lo conviertes en bytes e intentas asignar "eso" al picturebox, te da un error en System.Drawing.Dll porque no es capaz de interpretar ese texto como una imagen válida.

    Aparte de que en general es una pésima práctica generar sentencias SQL como lo estás haciendo (insertando valores en el texto de la sentencia), en el caso particular de las imágenes no solo es una mala práctica sino que directamente no funciona (salvo que hagas maravillas para codificar la imagen en hexadecimal).

    Si parametrizas la sentencia, basta con que asignes los bytes de la imagen al parámetro, y con eso la graba correctamente.

    miércoles, 10 de junio de 2020 14:11
    Moderador
  • Hola  Mauricio Hamak,

      

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te comparto los siguientes enlaces con respecto al caso que reportas

    1. write y read de image en sql server

    2. Ejemplo

    3. Explicacion de la excepcion que tienes https://docs.microsoft.com/es-es/dotnet/api/system.argumentexception?view=netcore-3.1

    Gracias por usar los foros de MSDN. 

      

    Andres Aguilar 

     ____________________________ 

      

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. 



    miércoles, 10 de junio de 2020 19:29
    Moderador