Guardar imagen en BD usando SQL server y Visual Studio c#

Publicado en 'Programación' por Freekmans, 9 Ago 2018, 09:32.





  1. Freekmans

    Freekmans Miembro maestro

    Registro:
    10 Jun 2013
    Mensajes:
    664
    Likes:
    67
    Temas:
    111




    Buen día amigos, una consulta, alguien sabe como guardar una imagen en una BD usando sql y c#? Tengo poca noción, quise cargar la imagen con un openfiledialog y mostrarla en un picturebox y de ahí guardarla en la BD. Estoy usando para esto un storeprocedure de la misma BD pero, al capturar los datos del form, me manda un error "no hay ninguna asignación de tipo de objeto system.drawing.bitmap a un tipo nativo de un proveedor administrado conocido." Estoy trabajando sobre la BD de ejemplo Northwind, practicando un poco. Saludos :)
     


  2. RockPuro

    RockPuro Miembro maestro

    Registro:
    20 Oct 2016
    Mensajes:
    258
    Likes:
    76
    Temas:
    19
    Si se puede tienes que hacer un método para que te guarde en formato byte hacia sql server, es para escritorio o web ?
     
  3. Epikurolibre

    Epikurolibre Miembro de plata

    Registro:
    3 Oct 2010
    Mensajes:
    4,245
    Likes:
    1,452
    Temas:
    159
    En sql crea un campo tipo blob y en c# los manejas como byte.
     
  4. Freekmans

    Freekmans Miembro maestro

    Registro:
    10 Jun 2013
    Mensajes:
    664
    Likes:
    67
    Temas:
    111
    Ahorita es para escritorio, en Windows forms
     
  5. RockPuro

    RockPuro Miembro maestro

    Registro:
    20 Oct 2016
    Mensajes:
    258
    Likes:
    76
    Temas:
    19
    Solo toma un control de cuadro de imagen de la caja de herramientas. ahora configure la imagen de cuadro de imagen de esta manera.


    private void btnBrowser_Click(object sender, EventArgs e)
    {
    openFileDialog1.Title = "Choose Image";
    openFileDialog1.Filter = "Images (*.JPEG;*.BMP;*.JPG;*.GIF;*.PNG;*.)|*.JPEG;*.BMP;*.JPG;*.GIF;*.PNG";
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
    Image img = new Bitmap(openFileDialog1.FileName);
    pictureBoxCompanyLogo.Image = img;// resizeImage(img);
    }
    }

    y antes de guardar esta imagen en la base de datos, convierta esta imagen de cuadro de imagen en formato de byte [].

    public static byte[] ImageToByteArray(Image img,PictureBox pictureBoxCompanyLogo) { System.IO.MemoryStream ms = new System.IO.MemoryStream(); if (pictureBoxCompanyLogo.Image != null) { img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); } return ms.ToArray(); }

    Y llamas este método

    byte[] byteImg=ImageToByteArray(pictureBoxCompanyLogo.Image, pictureBoxCompanyLogo);
     
    A Freekmans le gustó este mensaje.
  6. Freekmans

    Freekmans Miembro maestro

    Registro:
    10 Jun 2013
    Mensajes:
    664
    Likes:
    67
    Temas:
    111
    Bacan, llegando a casa lo pruebo y te comento, muchas gracias"!
     
  7. Freekmans

    Freekmans Miembro maestro

    Registro:
    10 Jun 2013
    Mensajes:
    664
    Likes:
    67
    Temas:
    111
    Me recontra sirvió! Por ahí tuve que entender un poco la lógica y acomodarlo a mi programa pero sirvió, muchas gracias!
     
  8. RockPuro

    RockPuro Miembro maestro

    Registro:
    20 Oct 2016
    Mensajes:
    258
    Likes:
    76
    Temas:
    19
    De nada bro, cualquier duda que tienes puedes consultarme
     
  9. zlader

    zlader Miembro de bronce

    Registro:
    30 Oct 2009
    Mensajes:
    1,110
    Likes:
    141
    Temas:
    8
    Ahora recuerda que lo mas recomendable es no guardar las imagenes en la BD, tu mismo has tus pruebas y ve que tanto afecta al tamaño de tu BD.
     
  10. Freekmans

    Freekmans Miembro maestro

    Registro:
    10 Jun 2013
    Mensajes:
    664
    Likes:
    67
    Temas:
    111
    Pero al guardarla como Byte[] sigue pesando mucho?
     
  11. zlader

    zlader Miembro de bronce

    Registro:
    30 Oct 2009
    Mensajes:
    1,110
    Likes:
    141
    Temas:
    8
    Obviamente que si, tienen que guardar Byte a Byte el archivo en un registro, si las imagenes pesan 20MB, eso se le suma a la BD por cada imagen.
     
  12. Freekmans

    Freekmans Miembro maestro

    Registro:
    10 Jun 2013
    Mensajes:
    664
    Likes:
    67
    Temas:
    111
    Justo ahora he estado practicando un poco más, nuevamente con la BD Northwind. Ahora lo que estuve queriendo hacer es mostrar en un TextBox el ID, como es Identity, siempre saldrá el correlativo para poder mostrar el proximo registro qué se agregará. He realizado un pequeño SP
    "
    select EmployeeID from dbo.Employees where EmployeeID = (Select MAX(EmployeeID)from dbo.Employees)
    go"

    Para capturar el valor que menciono, mi idea es aumentar + 1 el valor que capturo en ese procedure ("Así obtengo el proximo registro"), pero no sé como hacer para mostrarlo en el textbox. No sé si me dejo entender :s

    Bueno, hice lo siguiente, sé que hay cosas por mejorar aún pero me salió:

    private void obtenerID(TextBox id)
    {
    SqlCommand cmd = new SqlCommand("ultimo_ID", cn);
    cn.Open();
    SqlDataReader leer = cmd.ExecuteReader();
    if(leer.Read() == true)
    {
    id.Text = Convert.ToString(Convert.ToInt32(leer["EmployeeID"])+1);
    }
    cn.Close();
    }

    Y luego al asignar el valor al Textobx en el load obtenerID(txtID);
     
  13. gnox

    gnox Miembro de bronce

    Registro:
    3 Ene 2013
    Mensajes:
    1,787
    Likes:
    695
    Temas:
    64
    Un Identity lo debes obtener despues de ejecutar el INSERT, si una sola persona esta usando el programa/sistema que estas creando no habria inconveniente, pero cuando mas personas lo usan ahi generas un id invalido si otro usuario grabo, borro o creo mientras otro usuario (tu) tratabas de crear (problema de concurrencia).

    Normalmente en un programa/sistema en su pantalla frontend los campos identity, si es que se muestran, los vas a ver como con una etiqueta "Next" o "Nuevo" recien cuando se crea el registro se cambia a valor asignado por la base, dicho esto en resumen es mala practica calcularle su siguiente valor a un identity solo debes obtenerlo despues de crearlo.

    Revisa lo que es scope_identity de sql server.
     
  14. Freekmans

    Freekmans Miembro maestro

    Registro:
    10 Jun 2013
    Mensajes:
    664
    Likes:
    67
    Temas:
    111
    Entiendo, si estuve revisando un poco del Scopte y si vi que lo usaban a la par del Insert. Lo malo es que a veces no enseñan a hacer programación pensando solo en que nosotros los vamos a usar (quizá tengo ese pensamiento porque solo he llevado POO), pero vamos, que desde el inicio deberían hacernos pensar en app mas empresariales no?
     
  15. gnox

    gnox Miembro de bronce

    Registro:
    3 Ene 2013
    Mensajes:
    1,787
    Likes:
    695
    Temas:
    64
    Si estas pagando por algo pregunta, cuestiona lo que te enseñan, pide donde conseguir mas info, como se aplica en el desarrollo actual de sistemas, y aplicar criterio sobre lo aprendido. La gran mayoria solo se queda sentado escuchando en un salon tomando nota y creen que lo que te van a enseñar es suficiente, tienes que investigar y practicar por tu cuenta.