none
Guardar Imagen en Base de Datos de Access 2010/13 en Vb.Net RRS feed

  • Pregunta

  • Hola.

    Estuve buscando <¿Cómo guardar una Imagen en una Base de Datos de Access?> y encontré esto en una pregunta de SQL:

    'ESTO GUARDA UN CAMPO ID Y UNA IMAGEN (SQL) Option Strict On Option Explicit On Imports System.IO Imports System.Data.SqlClient Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Try InsertarFotoEnBDD(1, "D:\TU_CARPETA\TU_FICHERO_IMAGEN.JPG") MessageBox.Show("Se guardó la foto en la base de datos", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information) Catch ex As Exception MessageBox.Show("Error: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub Private Sub InsertarFotoEnBDD(id As Integer, filefoto As String) Try Dim ms As MemoryStream = New MemoryStream() Dim fs As FileStream = New FileStream(filefoto, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) ms.SetLength(fs.Length) fs.Read(ms.GetBuffer(), 0, CInt(fs.Length)) Dim arrImg() As Byte = ms.GetBuffer() ms.Flush() fs.Close() Using conn As New SqlConnection("TU_CADENA_DE_CONEXION") Using cmd As SqlCommand = conn.CreateCommand() conn.Open() cmd.CommandText = "Insert Into TU_TABLA ([ID], [IMAGEN]) Values ( @id, @imagen)" cmd.Parameters.Add("@id", SqlDbType.BigInt).Value = id cmd.Parameters.Add("@imagen", SqlDbType.VarBinary).Value = arrImg cmd.ExecuteNonQuery() End Using End Using ms.Close() Catch ex As Exception Throw New Exception(ex.Message) End Try End Sub End Class

    'Fuente: https://social.msdn.microsoft.com/Forums/es-ES/c3f732de-0247-46e8-b983-ba70a7dc2671/guardar-imagenes-en-base-de-datos-accessobjeto-ole-y-visual-basic?forum=vbes

    ----

    Pero en mi base de datos tengo campos de texto y un objeto OLE y los guardo así: (foto.image.toString no es válido)

    'Guardar: SOLO GUARDA LOS CAMPOS DE TEXTO
        Sub Guardar()
            
           
            If Modi = False Then
    
                'Esto se realiza si se creó un registro nuevo
                'Procedimientos de Rutina
                Cmd.CommandType = CommandType.Text
                Cmd.Connection = Cnn
                Sql = ""
                'Instrucción
                Sql = "Insert Into Table (Id,Apellido,Nombre,Telefono,Celular,Facebook,Twitter,Otra,Email,Nota,Foto) Values ('" & Form1.txtID.Value & "','" & Form1.txtApellido.Text & "','" & Form1.txtNombre.Text & "','" & Form1.txtTel.Text & "','" & Form1.txtCel.Text & "','" & Form1.txtFace.Text & "','" & Form1.txtTwit.Text & "','" & Form1.txtOter.Text & "','" & Form1.txtEmail.Text & "','" & Form1.txtNote.Text & "','" & Form1.Foto.Image.ToString & "') "
                Cmd.CommandText = Sql
                'Guardar y Mensaje
                Try
                    Cmd.ExecuteNonQuery()
                    MsgBox("Registro agregado con Éxito.", MsgBoxStyle.Information, "Nuevo Registro")
                Catch ex As Exception
                    'Error
                    Dim msg As String = ""
                    msg = "Código de error específico: " & vbNewLine & ex.HResult & vbNewLine & "Por favor, infórmanos de este programa."
                    MsgBox(msg, MsgBoxStyle.Critical, "Error detectado")
                    msg = "Mensaje Descriptivo: " & vbNewLine & ex.Message
                    MsgBox(msg, MsgBoxStyle.Critical, "Descripción de Error")
                End Try
    
    
            Else
                'Esto se realiza si se está editando un registro existente
                Cmd.CommandType = CommandType.Text
                Cmd.Connection = Cnn
                'Instrucción
                Sql = "Update Contactos Set "
                Sql += "Id = '" & Form1.txtID.Text & "', "
                Sql += "Apellido = '" & Form1.txtApellido.Text & "', "
                Sql += "Nombre = '" & Form1.txtNombre.Text & "', "
                Sql += "Telefono = '" & Form1.txtTel.Text & "', "
                Sql += "Celular = '" & Form1.txtCel.Text & "', "
                Sql += "Facebook = '" & Form1.txtFace.Text & "', "
                Sql += "Twitter = '" & Form1.txtTwit.Text & "', "
                Sql += "Otra = '" & Form1.txtOter.Text & "' "
                Sql += "Email = '" & Form1.txtEmail.Text & "' "
                Sql += "Nota = '" & Form1.txtNote.Text & "' "
                'En este renglón de comentario se debería guardar la imagen
                Sql += "where Id = " & Form1.txtID.Text & " "
                Cmd.CommandText = Sql
                'Guardar y Mensaje
                Try
                    Cmd.ExecuteNonQuery()
                    MsgBox("Registro modificado con Éxito.", MsgBoxStyle.Information, "Editar Registro")
                Catch ex As Exception
                    'Error
                    Dim msg As String = ""
                    msg = "Código de error específico: " & vbNewLine & ex.HResult
                    MsgBox(msg, MsgBoxStyle.Critical, "Error detectado")
                    msg = "Mensaje Descriptivo: " & vbNewLine & ex.Message
                    MsgBox(msg, MsgBoxStyle.Critical, "Descripción de Error")
                End Try
            End If
        End Sub

    ----

    En lo que necesito ayuda es en adaptar el código de sql al que tengo de Access.

    ----
    Objetivo: Guardar los campos de texto y la imagen del PictureBox llamado Foto en la base de datos
    Actual: Guarda solo campos de texto
    ----


    Atte. Pablo. [VB.Net - Visual Studio 2015] Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje. Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.


    domingo, 7 de febrero de 2016 19:17

Respuestas

  • Deberías usar parámetros y asignarle al campo Foto un array de bytes.

                'Esto se realiza si se creó un registro nuevo
                'Procedimientos de Rutina
                Cmd.CommandType = CommandType.Text
                Cmd.Connection = Cnn
                Sql = ""
                'Instrucción
                Sql = "INSERT INTO Table (Id,Apellido,Nombre,Telefono,Celular,Facebook,Twitter,Otra,Email,Nota,Foto)" & _
                    " Values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
                Cmd.CommandText = Sql
                Cmd.Parameters.AddWithValue("@ID", Form1.txtID.Value)
                Cmd.Parameters.AddWithValue("@Apellido", Form1.txtApellido.Text)
                Cmd.Parameters.AddWithValue("@Nombre", Form1.txtNombre.Text)
                Cmd.Parameters.AddWithValue("@Tel", Form1.txtTel.Text)
                Cmd.Parameters.AddWithValue("@Cel", Form1.txtCel.Text)
                Cmd.Parameters.AddWithValue("@Face", Form1.txtFace.Text)
                Cmd.Parameters.AddWithValue("@Twit", Form1.txtTwit.Text)
                Cmd.Parameters.AddWithValue("@Other", Form1.txtOter.Text)
                Cmd.Parameters.AddWithValue("@Email", Form1.txtEmail.Text)
                Cmd.Parameters.AddWithValue("@Note", Form1.txtNote.Text)
                If Form1.Foto.Image Is Nothing Then
                    Cmd.Parameters.AddWithValue("@Foto", DBNull.Value)
                Else
                    Dim arrImage() As Byte
                    Dim myMs As New IO.MemoryStream
                    Form1.Foto.Image.Save(myMs, Form1.Foto.Image.RawFormat)
                    arrImage = myMs.GetBuffer()
                    Cmd.Parameters.Add("@Foto", OleDbType.Binary).Value = arrImage
                End If
    
                'Guardar y Mensaje
                Try
                    Cmd.ExecuteNonQuery()
                    MsgBox("Registro agregado con Éxito.", MsgBoxStyle.Information, "Nuevo Registro")
                Catch ex As Exception
                    'Error
                    Dim msg As String = ""
                    msg = "Código de error específico: " & vbNewLine & ex.HResult & vbNewLine & "Por favor, infórmanos de este programa."
                    MsgBox(msg, MsgBoxStyle.Critical, "Error detectado")
                    msg = "Mensaje Descriptivo: " & vbNewLine & ex.Message
                    MsgBox(msg, MsgBoxStyle.Critical, "Descripción de Error")
                End Try


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta Admin Pablo Fac domingo, 7 de febrero de 2016 21:07
    domingo, 7 de febrero de 2016 20:20

Todas las respuestas

  • Deberías usar parámetros y asignarle al campo Foto un array de bytes.

                'Esto se realiza si se creó un registro nuevo
                'Procedimientos de Rutina
                Cmd.CommandType = CommandType.Text
                Cmd.Connection = Cnn
                Sql = ""
                'Instrucción
                Sql = "INSERT INTO Table (Id,Apellido,Nombre,Telefono,Celular,Facebook,Twitter,Otra,Email,Nota,Foto)" & _
                    " Values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
                Cmd.CommandText = Sql
                Cmd.Parameters.AddWithValue("@ID", Form1.txtID.Value)
                Cmd.Parameters.AddWithValue("@Apellido", Form1.txtApellido.Text)
                Cmd.Parameters.AddWithValue("@Nombre", Form1.txtNombre.Text)
                Cmd.Parameters.AddWithValue("@Tel", Form1.txtTel.Text)
                Cmd.Parameters.AddWithValue("@Cel", Form1.txtCel.Text)
                Cmd.Parameters.AddWithValue("@Face", Form1.txtFace.Text)
                Cmd.Parameters.AddWithValue("@Twit", Form1.txtTwit.Text)
                Cmd.Parameters.AddWithValue("@Other", Form1.txtOter.Text)
                Cmd.Parameters.AddWithValue("@Email", Form1.txtEmail.Text)
                Cmd.Parameters.AddWithValue("@Note", Form1.txtNote.Text)
                If Form1.Foto.Image Is Nothing Then
                    Cmd.Parameters.AddWithValue("@Foto", DBNull.Value)
                Else
                    Dim arrImage() As Byte
                    Dim myMs As New IO.MemoryStream
                    Form1.Foto.Image.Save(myMs, Form1.Foto.Image.RawFormat)
                    arrImage = myMs.GetBuffer()
                    Cmd.Parameters.Add("@Foto", OleDbType.Binary).Value = arrImage
                End If
    
                'Guardar y Mensaje
                Try
                    Cmd.ExecuteNonQuery()
                    MsgBox("Registro agregado con Éxito.", MsgBoxStyle.Information, "Nuevo Registro")
                Catch ex As Exception
                    'Error
                    Dim msg As String = ""
                    msg = "Código de error específico: " & vbNewLine & ex.HResult & vbNewLine & "Por favor, infórmanos de este programa."
                    MsgBox(msg, MsgBoxStyle.Critical, "Error detectado")
                    msg = "Mensaje Descriptivo: " & vbNewLine & ex.Message
                    MsgBox(msg, MsgBoxStyle.Critical, "Descripción de Error")
                End Try


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta Admin Pablo Fac domingo, 7 de febrero de 2016 21:07
    domingo, 7 de febrero de 2016 20:20
  • Hola Asier Villanueva.

    Error al ejecutar "Cmd.ExecuteNonQuery" porque necesita una conexión abierta: añadí "cnn.open", cnn es la cadena de conexión a la base de datos, y se arregló.

    Despues de agregar eso ejecuto el programa, agrego todos los campos pero no agrego foto y hago click en el botón guardar, y salta esto: Error de Sintaxis en la instrucción Insert INTO.

    Si quieres creo un nuevo "hilo" sobre este otro error.

    Salu2.


    Atte. Pablo.

    [VB.Net - Visual Studio 2015]


    domingo, 7 de febrero de 2016 21:14