Visual .Net: Guardar Imagen en Base de Datos

Muchas veces he tenido la necesidad de querer guardar una imagen especifica en un proyecto, pero mi dilema siempre fue que era lo mejor, si guardarla en el servidor, como un copia y pega, ó guardarla en la misma base de datos. Claro que ambos procedimientos tienes sus pros y contras, ventajas y desventajas, que pasare a  detallar a continuación.

  • Si lo guardas en el Servidor de manera física(no en BD) evitas que la base de datos se sobre cargue de imágenes ya que si guardas una imagen de bastante resolución pues hará que ocupe bastante espacio en la BD.
  • Pero el riesgo que puedan borrase fácilmente o que el espacio asignado en el servidor tenga un limite muy bajo. o que la carpeta donde estas guarda la imagen sea borrada o el nombre sea cambiado.
  • Si lo guardas en BD te ahorras el tiempo de administrar las imágenes, ya que te aseguras que estarán en el servidor de base datos donde para eliminar hay muchas reglas que evitarían eso.
  • Si lo Guardas en BD habría un tiempo de demora en procesar esa petición ya que la imagen dependiendo de su tamaño en resolución tiene que ser procesada para mostrarla en tu proyecto

Bueno todo esto ya queda en sus manos, es criterio y decisión de cada uno, el mio es guardarla en la BD ya que mi proyecto no sera una galería de imágenes, y solo guardare unas cuantas por lo que me conviene realizar el almacenamiento en la BD.

Buena, esta vez les enseñare a guardar esas imágenes de cualquier formato ya sean JPG,BMP,PNG para esto utilizaremos el lenguaje de programación Visual Studio .Net y SQL Server, las versiones no importan mucho ya que la sintaxis la trabaje desde la versión 2008 así que hay pocos cambios en adelante.

Mi ejemplo sera construir un formulario para guardar la configuración del Sistema como Nombre de Empresa, Color de Interfaz e Imagen de Fondo del Proyecto(comunmente utilizado en el fondo de un MDIParent)

  1. ESTRUCTURA DE TABLA EN SQL: Este script tiene los tres campos basics para este ejemplo, en el se encuentra un campo tipo IMAGE el cual almacenara la imagen en bytes, para saber mas de este tipo de campo leer TIPOS DE DATOS 
    CREATE TABLE sys_Config
     (
       id_Config INT IDENTITY(1,1) PRIMARY KEY
     ,nom_app VARCHAR(20)
     ,color_app char(7)
     ,img_MDI image
     )
    
  2. DISEÑO DE FORMULARIO: Deberás agregar :Tres Labels – Dos Cajas de Texto(txtNombre, txtIMGMdi ) – Un PictureBox(ptcolor) -: Dos Buttons (btImagen, btUp) te debería quedar así.
  3. CODIFICANDO FUNCIONES: En este ejemplo estoy trabajando en el modelo de programación de 03 capas pero en esta ocasión solo programare desde la Capa Negocio, asumo que las clases de conexión ya las tienen implementadas, el código seria así:
    Imports System.Data.SqlClient
    Public erru As String
    Public Function UpConf(ByVal NomSys As String, ByVal COLOR As String, ByVal IMGMDI() As Byte = Nothing) As Boolean
    Try
    Dim dllBD As New Capa_Datos.Conex
    Dim ds As New DataSet
    dllBD.INICIACONEX(DB)
    Dim dpt As New SqlDataAdapter("UST_UPDATE_CONFIG", dllBD.cn)
    dpt.SelectCommand.CommandType = CommandType.StoredProcedure
    dpt.SelectCommand.Parameters.AddWithValue("@NOMSYS", NomSys)
    dpt.SelectCommand.Parameters.AddWithValue("@COLORSYS", COLOR)
    dpt.SelectCommand.Parameters.AddWithValue("@MODIMG", MODIMG)
    dpt.SelectCommand.ExecuteNonQuery()
    dllBD.CERRARCONEX()
    UpConf = True
    dllBD = Nothing
    ds = Nothing
    dpt = Nothing
    Catch ex As Exception
    erru = Err.Description
    UpConf = False
    End Try
    End Function
    

    Bien ahora el código en el formulario para cada botón, los cuales tendrán las funciones de abrir los cuadros de dialogo, para elegir el color para el MDI y la imagen de fondo del MDI, también estará el código que convierte a byte la imagen para luego pasarla a la Capa Negocios (CapaNeg, en la clase cls-conf. Como dije asumo que la clase conexión a la base de datos ya la tienen funcionando.

    'CODIGO PARA ABRIR UN CUADRO PARA ELEGIR COLOR
    Private Sub ptColor_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ptcolor.Click
     Dim verFolder As New ColorDialog
     Dim result As DialogResult = verFolder.ShowDialog()
     If result = Windows.Forms.DialogResult.OK Then
     ptcolor.BackColor = verFolder.Color
     End If
     verFolder = Nothing
     End Sub
    
    'CODIGO PARA ABRIR UN CUADRO PAA ELEGIR UNA IMAGEN DE NUESTRA BIBLIOTECA
     Private Sub btImage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btImage.Click
     Dim verFolder As New OpenFileDialog
     verFolder.Filter = "Todas las Imagenes|*.jpg;*.gif;*.png"
     verFolder.Title = "IMAGEN para Pantalla Principal"
     verFolder.ShowDialog()
     If verFolder.FileName <> "" Then
     txtIMGMdi.Text = verFolder.FileName
     End If
     verFolder = Nothing
     End Sub
    
    'CODIGO PARA REALIZAR LA ACTUALIZACION, GRABAR DATOS EN LA BD
    Private Sub btUp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btUp.Click
     Dim add As Boolean, imgmdi As String
     Dim Config As New CapaNeg.clsConf
     If ptcolor.BackColor.Name <> "Control" And txtIMGMdi.Text <> "" Then
     add = Config.UpConf(txtNombre.Text, ptcolor.BackColor.Name, Image2Bytes(Image.FromFile(txtIMGMdi.Text)))
     ElseIf ptcolor.BackColor.Name <> "Control" And txtIMGMdi.Text = "" Then
     add = Config.UpConf(txtNombre.Text, ptcolor.BackColor.Name, Nothing)
     ElseIf ptcolor.BackColor.Name = "Control" And txtIMGMdi.Text <> "" Then
     add = Config.UpConf( txtNombre.Text, Nothing, Image2Bytes(Image.FromFile(txtIMGMdi.Text)))
     ElseIf ptcolor.BackColor.Name = "Control" And txtIMGMdi.Text = "" Then
     add = Config.UpConf(txtNombre.Text, Nothing, Nothing)
     End If
     If add = False Then
     MsgBox("Error Actualizando. Datos: " & Config.erru, MsgBoxStyle.Critical, "Error del Servidor")
     Else
     MsgBox("¡ACTUALIZACIÓN CORRECTA!" & vbNewLine & "Para que todos cambios surtan efecto se recomienda cerrar todas las terminales.", MsgBoxStyle.Information, "Bien hecho!")
     If ptcolor.BackColor.Name <> "Control" Then
     mdPrincipal.MenuStrip.BackColor = ptcolor.BackColor
     mdPrincipal.ToolStrip.BackColor = ptcolor.BackColor
     End If
     If txtIMGMdi.Text <> "" Then mdPrincipal.BackgroundImage = System.Drawing.Bitmap.FromFile(txtIMGMdi.Text)
     End If
     Config = Nothing
     add = Nothing
     End Sub
    
    ' FUNCION PARA TRANSFORMAR IMAGENES EN BYTES PARA SER GUARDADA EN LA BD
     Public Function Image2Bytes(ByVal img As Image) As Byte()
            Dim sTemp As String = Path.GetTempFileName()
            Dim fs As New FileStream(sTemp, FileMode.OpenOrCreate, FileAccess.ReadWrite)
            img.Save(fs, System.Drawing.Imaging.ImageFormat.Png)
            fs.Position = 0
            '
            Dim imgLength As Integer = CInt(fs.Length)
            Dim bytes(0 To imgLength - 1) As Byte
            fs.Read(bytes, 0, imgLength)
            fs.Close()
            Return bytes
        End Function
    
        Public Function Bytes2Image(ByVal bytes() As Byte) As Image
            If bytes Is Nothing Then Return Nothing
            '
            Dim ms As New MemoryStream(bytes)
            Dim bm As Bitmap = Nothing
            Try
                bm = New Bitmap(ms)
            Catch ex As Exception
                System.Diagnostics.Debug.WriteLine(ex.Message)
            End Try
            Return bm
        End Function
    
  4. Por ultimo lo que nos quedaría es adecuar este código en su proyecto, ya que como podemos ver no es nada difícil solo es cuestión de ingenio, cualquier duda la pueden hacer e los comentarios. También les dejo un link de mucha ayuda, se trata de SQLFiddle y es una pagina en a cual podran probar su código SQL antes de meterlo al SQL Server o cualquier otro motor de base de datos, muy util cuando no tienen el servidor a la mano, con esto harian una preprueba, muy fácil de utilizar y con soporte para varios motores de base de datos.

Valora este Artículo
Visual .Net: Guardar Imagen en Base de Datos
Qué te pareció?
Sobre el Autor
Soy un joven entusiasta, me gusta aprender por mi cuenta, soy de profesión Técnico en Computación e Informática, me gusta ayudar a la gente con sus problemas informáticos, aprecio la familia... Quiero y lograré alcanzar todos mis objetivos.
Comparte si te ha Gustado
Artículos Relacionados