none
insertar imagen en base de datos mysql con vb.net

    Pregunta

  • hola, estoy atorado tratando de guardar una imagen en un base de dtos mysql. asi tengo estructurada mi ap.
    uso un module de conexion global y clases de datos donde almaceno mis variables para conectar con las tablas y campos de la base de datos.
    modulo conexion gloval

    'importo las funciones de mysql
    Imports MySql.Data
    Imports MySql.Data.Types
    Imports MySql.Data.MySqlClient
    Module Mod_conexionGlobal
        Public _cadena As String 'almacena los datos de conexin al server
        Public _conexion As New MySqlConnection 'se declara la variable publica para abrir/cerrar la conexion
        Public Function Conexion_Global() As Boolean
            Dim estado As Boolean = True
            Try
                _cadena = ("server=localhost;User Id=misuario;database=controlrepar;Password=1234")
                _conexion = New MySqlConnection(_cadena)
            Catch ex As MySqlException
                MessageBox.Show(ex.Message)
                estado = False
            End Try
            Return estado
        End Function
        Public Sub Cerrar()
            _conexion.Close()
        End Sub
    End Module

    classe ins para guardar, editar o eliminar datos

    'importo mysql drivers
    Imports MySql.Data
    Imports MySql.Data.Types
    Imports MySql.Data.MySqlClient
    Public Class Class_ins
        Private _adaptador As New MySqlDataAdapter
     Public Function insertarDatos_res(ByVal datos As Class_datos) As Boolean
            Dim estado As Boolean = True
            Try
                Conexion_Global()
                _adaptador.InsertCommand = New MySqlCommand("insert into recepcion(resid_Cliente, resrecep_Date, resmarca_Equipo, resmodel_Equipo, restipo_Equipo, res_Serie, resdesc_Equipo, foto_Equipo, foto_Equipo1, foto_Equipo2, foto_Equipo3) _
    values (@resid_Cliente, @resrecep_Date, @resmarca_Equipo, @resmodel_Equipo, @restipo_Equipo, @res_Serie, @resdesc_Equipo, @foto_Equipo, @foto_Equipo1, @foto_Equipo2, @foto_Equipo3", _conexion)
                _adaptador.InsertCommand.Parameters.Add("@resid_Cliente", MySqlDbType.Int32).Value = datos.resid_Cliente
                _adaptador.InsertCommand.Parameters.Add("@resrecep_Date", MySqlDbType.Date).Value = datos.resrecep_Date
                _adaptador.InsertCommand.Parameters.Add("@resmarca_Equipo", MySqlDbType.VarChar, 20).Value = datos.resmarca_Equipo
                _adaptador.InsertCommand.Parameters.Add("@resmodel_Equipo", MySqlDbType.VarChar, 20).Value = datos.resmodel_Equipo
                _adaptador.InsertCommand.Parameters.Add("@restipo_Equipo", MySqlDbType.VarChar, 20).Value = datos.restipo_Equipo
                _adaptador.InsertCommand.Parameters.Add("@res_Serie", MySqlDbType.VarChar, 45).Value = datos.res_Serie
                _adaptador.InsertCommand.Parameters.Add("@resdesc_Equipo", MySqlDbType.VarChar, 500).Value = datos.resdesc_Equipo
                _adaptador.InsertCommand.Parameters.Add("@foto_Equipo", MySqlDbType.Blob).Value = datos.foto_Equipo
                _adaptador.InsertCommand.Parameters.Add("@foto_Equipo1", MySqlDbType.Blob).Value = datos.foto_Equipo1
                _adaptador.InsertCommand.Parameters.Add("@foto_Equipo2", MySqlDbType.Blob).Value = datos.foto_Equipo2
                _adaptador.InsertCommand.Parameters.Add("@foto_Equipo3", MySqlDbType.Blob).Value = datos.foto_Equipo3
                _conexion.Open()
                _adaptador.InsertCommand.Connection = _conexion
                _adaptador.InsertCommand.ExecuteNonQuery()
            Catch ex As MySqlException
                MessageBox.Show(ex.Message)
                estado = False
            Finally
                Cerrar()
            End Try
            Return estado
        End Function
        'funcion para actualizar datos en la tabla recepcion res
        Public Function actualizarDatosres(ByVal datos As Class_datos) As Boolean
            Dim estado As Boolean = True
            Try
                Conexion_Global()
                _adaptador.UpdateCommand = New MySqlCommand("update recepcion set resid_Cliente=@resid_Cliente, resrecep_date=@resrecep_Date, resmarca_Equipo=@resmarca_Equipo, resmodel_Equipo=@resmodel_Equipo, _
    restipo_Equipo=@restipo_Equipo, res_Serie=@res_Serie, resdesc_Equipo=@resdesc_Equipo, foto_Equipo=@foto_Equipo, foto_Equipo1=@foto_Equipo1, foto_Equipo2=@foto_Equipo2, foto_Equipo3=@foto_Equipo3 where resfolio_Rep=@resfolio_Rep", _conexion)
                _adaptador.UpdateCommand.Parameters.Add("@resfolio_Rep", MySqlDbType.Int32).Value = datos.resfolio_Rep
                _adaptador.UpdateCommand.Parameters.Add("@resid_Cliente", MySqlDbType.Int32).Value = datos.resid_Cliente
                _adaptador.UpdateCommand.Parameters.Add("@resrecp_Date", MySqlDbType.Date).Value = datos.resrecep_Date
                _adaptador.UpdateCommand.Parameters.Add("@resmarca_Equipo", MySqlDbType.VarChar, 20).Value = datos.resmarca_Equipo
                _adaptador.UpdateCommand.Parameters.Add("@resmodel_Equipo", MySqlDbType.VarChar, 20).Value = datos.resmodel_Equipo
                _adaptador.UpdateCommand.Parameters.Add("@restipo_Equipo", MySqlDbType.VarChar, 20).Value = datos.restipo_Equipo
                _adaptador.UpdateCommand.Parameters.Add("@res_Serie", MySqlDbType.VarChar, 45).Value = datos.res_Serie
                _adaptador.UpdateCommand.Parameters.Add("@resdesc_Equipo", MySqlDbType.VarChar, 500).Value = datos.resdesc_Equipo
                _adaptador.UpdateCommand.Parameters.Add("@foto_Equipo", MySqlDbType.Blob).Value = datos.foto_Equipo
                _adaptador.UpdateCommand.Parameters.Add("@foto_Equipo1", MySqlDbType.Blob).Value = datos.foto_Equipo1
                _adaptador.UpdateCommand.Parameters.Add("@foto_Equipo2", MySqlDbType.Blob).Value = datos.foto_Equipo2
                _adaptador.UpdateCommand.Parameters.Add("@foto_Equipo3", MySqlDbType.Blob).Value = datos.foto_Equipo3
                _conexion.Open()
                _adaptador.UpdateCommand.Connection = _conexion
                _adaptador.UpdateCommand.ExecuteNonQuery()
            Catch ex As MySqlException
                MessageBox.Show(ex.Message)
                estado = False
            End Try
            Return estado
        End Function
        'funcion para eliminar datos tabla recepcion res
        Public Function eliminarDatosres(ByVal datos As Class_datos) As Boolean
            Dim estado = True
            Try
                Conexion_Global()
                _adaptador.DeleteCommand = New MySqlCommand("delete from recepcion where resfolio_Rep=@resfolio_Rep", _conexion)
                _adaptador.DeleteCommand.Parameters.Add("@resfolio_Rep", MySqlDbType.Int32).Value = datos.resfolio_Rep
                _conexion.Open()
                _adaptador.DeleteCommand.Connection = _conexion
                _adaptador.DeleteCommand.ExecuteNonQuery()
            Catch ex As MySqlException
                MessageBox.Show(ex.Message)
                estado = False
            Finally
                Cerrar()
            End Try
            Return estado
        End Function
    End Class

    clase datos donde tengo almacenados los campos y declare las variables a usar

    Public Class Class_datos
      'datos de la tabla recepcion
        Private _resfolio_Rep As Integer
        Private _resid_Cliente As Integer
        Private _resrecep_Date As Date
        Private _resmarca_Equipo As String
        Private _resmodel_Equipo As String
        Private _restipo_Equipo As String
        Private _res_Serie As String
        Private _resdesc_Equipo As String
        Private _foto_Equipo As Byte
        Private _foto_Equipo1 As Byte
        Private _foto_Equipo2 As Byte
        Private _foto_Equipo3 As Byte
        Public Property resfolio_Rep() As Integer
            Get
                Return _resfolio_Rep
            End Get
            Set(ByVal value As Integer)
                _resfolio_Rep = value
            End Set
        End Property
        Public Property resid_Cliente() As Integer
            Get
                Return _resid_Cliente
            End Get
            Set(ByVal value As Integer)
                _resid_Cliente = value
            End Set
        End Property
        Public Property resrecep_Date() As Date
            Get
                Return _resrecep_Date
            End Get
            Set(ByVal value As Date)
                _resrecep_Date = value
            End Set
        End Property
        Public Property resmarca_Equipo() As String
            Get
                Return _resmarca_Equipo
            End Get
            Set(ByVal value As String)
                _resmarca_Equipo = value
            End Set
        End Property
        Public Property resmodel_Equipo() As String
            Get
                Return _resmodel_Equipo
            End Get
            Set(ByVal value As String)
                _resmodel_Equipo = value
            End Set
        End Property
        Public Property restipo_Equipo() As String
            Get
                Return _restipo_Equipo
            End Get
            Set(ByVal value As String)
                _restipo_Equipo = value
            End Set
        End Property
        Public Property res_Serie() As String
            Get
                Return _res_Serie
            End Get
            Set(ByVal value As String)
                _res_Serie = value
            End Set
        End Property
        Public Property resdesc_Equipo() As String
            Get
                Return _resdesc_Equipo
            End Get
            Set(ByVal value As String)
                _resdesc_Equipo = value
            End Set
        End Property
        Public Property foto_Equipo() As Byte
            Get
                Return _foto_Equipo
            End Get
            Set(ByVal value As Byte)
                _foto_Equipo = value
            End Set
        End Property
        Public Property foto_Equipo1() As Byte
            Get
                Return _foto_Equipo1
            End Get
            Set(value As Byte)
                _foto_Equipo1 = value
            End Set
        End Property
        Public Property foto_Equipo2() As Byte
            Get
                Return _foto_Equipo2
            End Get
            Set(value As Byte)
                _foto_Equipo2 = value
            End Set
        End Property
        Public Property foto_Equipo3() As Byte
            Get
                Return _foto_Equipo3
            End Get
            Set(value As Byte)
                _foto_Equipo3 = value
            End Set
        End Property
    End Class

    este es mi boton de guardar, el erroe viene cuanto trato de pasar la imagen a bytes para cuargarla en el camp blob en mysq

    Private Sub BtnGuardar_Click(sender As Object, e As EventArgs) Handles BtnGuardar.Click
            'guardar datos nuevo comprobar si la variable nuevo es cierta/falsa para guardar nuevo/editar
            Dim conexion As New Class_ins
            Dim datos As New Class_datos
            Dim pic1, pic2, pic3, pic4 As New System.IO.MemoryStream()
            PctbImg1.Image.Save(pic1, System.Drawing.Imaging.ImageFormat.Jpeg)
            PctbImg2.Image.Save(pic2, System.Drawing.Imaging.ImageFormat.Jpeg)
            PctbImg3.Image.Save(pic3, System.Drawing.Imaging.ImageFormat.Jpeg)
            PctbImg4.Image.Save(pic4, System.Drawing.Imaging.ImageFormat.Jpeg)
            Dim img_byte() As Byte = pic1.GetBuffer()
            pic1.Close()
            _dtsdatos.Reset()
            datos.resid_Cliente = TxbIdCli.Text
            datos.resrecep_Date = TxbFecha.Text
            datos.resmarca_Equipo = TxbMarca.Text
            datos.resmodel_Equipo = TxbMod.Text
            datos.restipo_Equipo = Txbtipo.Text
            datos.resdesc_Equipo = TxbDesc.Text
            datos.foto_Equipo = img_byte   '<-- error el valor byte() no puede convertirse a byte
    
            If nuevo Then
                If conexion.insertarDatos_res(datos) Then
                    MessageBox.Show("Datos Guardados")
                Else
                    MessageBox.Show("Datos no guardados")
                End If
            Else
                datos.resfolio_Rep = TxbFolio.Text
                If conexion.actualizarDatosres(datos) Then
                    MessageBox.Show("Datos Actualizados")
                Else
                    MessageBox.Show("Datos no actualizados")
                End If
            End If
        End Sub

    viernes, 21 de octubre de 2016 2:02

Respuestas

  • Hola:

    datos.foto_Equipo es un byte (numero entre 0 y 255)
    img_byte es un array de bytes

    Tendras que definir a datos.foto_Equipo como un array de bytes

    Un saludo desde Bilbo
    Carlos

    viernes, 21 de octubre de 2016 7:57
  • Prueba con este ejemplo que da http://www.e-coffeetech.com/

    Imports System.Data
    Imports System.IO
    Imports MySql.Data.MySqlClient
    
    Public Class Form1
        Public cnn As MySqlConnection
        Dim StrConexion As String = "server=localhost;uid=usuario;password=pwd;database=BD"
    
        Private Sub Form1_Load(ByVal sender As System.Object,
                               _ ByVal e As System.EventArgs) Handles MyBase.Load
        End Sub
    
        Private Sub BtnAbrir_Click(ByVal sender As System.Object, 
                               _ ByVal e As System.EventArgs) Handles BtnAbrir.Click
           abrir_imagen()
        End Sub
    
        Private Sub BtnGuardar_Click(ByVal sender As System.Object, 
                               _ ByVal e As System.EventArgs) Handles BtnGuardar.Click
            Try
                Dim sql As String = "insert into tbl_imagenes(imagen)values(?imagen)"
                cnn = New MySqlConnection(StrConexion)
                Dim Comando As New MySqlCommand(sql, cnn)
                Dim Imag As Byte()
                Imag = Imagen_Bytes(Me.PictureBox1.Image)
    
                Comando.Parameters.AddWithValue("?imagen", Imag)
    
                cnn.Open()
                If cnn.State = ConnectionState.Open Then
                    Comando.ExecuteNonQuery()
                End If
                cnn.Close()
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
    
        Private Sub BtnBuscarBD_Click(ByVal sender As System.Object, 
                _ ByVal e As System.EventArgs) Handles BtnBuscarBD.Click
            Try
             Dim Sql As String = "select * from tbl_imagenes where id=" & Me.TxtID.Text & ""
                Dim lector As MySqlDataReader
                cnn = New MySqlConnection(StrConexion)
                cnn.Open()
                If cnn.State = ConnectionState.Open Then
                    Dim Imag As Byte()
                    Dim Comando As New MySqlCommand(Sql, cnn)
                    lector = Comando.ExecuteReader
                    While lector.Read
                        Imag = lector("imagen")
                        Me.PictureBox1.Image = Bytes_Imagen(Imag)
                    End While
                End If
                cnn.Close()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
    
        Private Sub abrir_imagen()
            Dim filename As String
            Dim openfiler As New OpenFileDialog
            'Definiendo propiedades al openfiledialog
            With openfiler
                'directorio inicial
                .InitialDirectory = "C:\"
                'archivos que se pueden abrir
                .Filter = "Archivos de imágen(*.jpg)|*.jpg|All Files (*.*)|*.*"
                'indice del archivo de lectura por defecto
                .FilterIndex = 1
                'restaurar el directorio al cerrar el dialogo
                .RestoreDirectory = True
            End With
            '
            'Evalua si el usuario hace click en el boton abrir
            If openfiler.ShowDialog = Windows.Forms.DialogResult.OK Then  
                'Obteniendo la ruta completa del archivo xml
                filename = openfiler.FileName
                Me.PictureBox1.Image = Image.FromFile(filename)
            End If
        End Sub
    
        'convertir binario a imágen
        Private Function Bytes_Imagen(ByVal Imagen As Byte()) As Image
            Try
                'si hay imagen
                If Not Imagen Is Nothing Then
                    'caturar array con memorystream hacia Bin
                    Dim Bin As New MemoryStream(Imagen)
                    'con el método FroStream de Image obtenemos imagen
                    Dim Resultado As Image = Image.FromStream(Bin)
                    'y la retornamos
                    Return Resultado
                Else
                    Return Nothing
                End If
            Catch ex As Exception
                Return Nothing
            End Try
        End Function
    
        'convertir imagen a binario
        Private Function Imagen_Bytes(ByVal Imagen As Image) As Byte()
            'si hay imagen
            If Not Imagen Is Nothing Then
                'variable de datos binarios en stream(flujo)
                Dim Bin As New MemoryStream
                'convertir a bytes
                Imagen.Save(Bin, Imaging.ImageFormat.Jpeg)
                'retorna binario
                Return Bin.GetBuffer
            Else
                Return Nothing
            End If
        End Function
    End Class

    viernes, 21 de octubre de 2016 13:23

Todas las respuestas

  • Hola:

    datos.foto_Equipo es un byte (numero entre 0 y 255)
    img_byte es un array de bytes

    Tendras que definir a datos.foto_Equipo como un array de bytes

    Un saludo desde Bilbo
    Carlos

    viernes, 21 de octubre de 2016 7:57
  • Prueba con este ejemplo que da http://www.e-coffeetech.com/

    Imports System.Data
    Imports System.IO
    Imports MySql.Data.MySqlClient
    
    Public Class Form1
        Public cnn As MySqlConnection
        Dim StrConexion As String = "server=localhost;uid=usuario;password=pwd;database=BD"
    
        Private Sub Form1_Load(ByVal sender As System.Object,
                               _ ByVal e As System.EventArgs) Handles MyBase.Load
        End Sub
    
        Private Sub BtnAbrir_Click(ByVal sender As System.Object, 
                               _ ByVal e As System.EventArgs) Handles BtnAbrir.Click
           abrir_imagen()
        End Sub
    
        Private Sub BtnGuardar_Click(ByVal sender As System.Object, 
                               _ ByVal e As System.EventArgs) Handles BtnGuardar.Click
            Try
                Dim sql As String = "insert into tbl_imagenes(imagen)values(?imagen)"
                cnn = New MySqlConnection(StrConexion)
                Dim Comando As New MySqlCommand(sql, cnn)
                Dim Imag As Byte()
                Imag = Imagen_Bytes(Me.PictureBox1.Image)
    
                Comando.Parameters.AddWithValue("?imagen", Imag)
    
                cnn.Open()
                If cnn.State = ConnectionState.Open Then
                    Comando.ExecuteNonQuery()
                End If
                cnn.Close()
    
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
    
        Private Sub BtnBuscarBD_Click(ByVal sender As System.Object, 
                _ ByVal e As System.EventArgs) Handles BtnBuscarBD.Click
            Try
             Dim Sql As String = "select * from tbl_imagenes where id=" & Me.TxtID.Text & ""
                Dim lector As MySqlDataReader
                cnn = New MySqlConnection(StrConexion)
                cnn.Open()
                If cnn.State = ConnectionState.Open Then
                    Dim Imag As Byte()
                    Dim Comando As New MySqlCommand(Sql, cnn)
                    lector = Comando.ExecuteReader
                    While lector.Read
                        Imag = lector("imagen")
                        Me.PictureBox1.Image = Bytes_Imagen(Imag)
                    End While
                End If
                cnn.Close()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
    
        Private Sub abrir_imagen()
            Dim filename As String
            Dim openfiler As New OpenFileDialog
            'Definiendo propiedades al openfiledialog
            With openfiler
                'directorio inicial
                .InitialDirectory = "C:\"
                'archivos que se pueden abrir
                .Filter = "Archivos de imágen(*.jpg)|*.jpg|All Files (*.*)|*.*"
                'indice del archivo de lectura por defecto
                .FilterIndex = 1
                'restaurar el directorio al cerrar el dialogo
                .RestoreDirectory = True
            End With
            '
            'Evalua si el usuario hace click en el boton abrir
            If openfiler.ShowDialog = Windows.Forms.DialogResult.OK Then  
                'Obteniendo la ruta completa del archivo xml
                filename = openfiler.FileName
                Me.PictureBox1.Image = Image.FromFile(filename)
            End If
        End Sub
    
        'convertir binario a imágen
        Private Function Bytes_Imagen(ByVal Imagen As Byte()) As Image
            Try
                'si hay imagen
                If Not Imagen Is Nothing Then
                    'caturar array con memorystream hacia Bin
                    Dim Bin As New MemoryStream(Imagen)
                    'con el método FroStream de Image obtenemos imagen
                    Dim Resultado As Image = Image.FromStream(Bin)
                    'y la retornamos
                    Return Resultado
                Else
                    Return Nothing
                End If
            Catch ex As Exception
                Return Nothing
            End Try
        End Function
    
        'convertir imagen a binario
        Private Function Imagen_Bytes(ByVal Imagen As Image) As Byte()
            'si hay imagen
            If Not Imagen Is Nothing Then
                'variable de datos binarios en stream(flujo)
                Dim Bin As New MemoryStream
                'convertir a bytes
                Imagen.Save(Bin, Imaging.ImageFormat.Jpeg)
                'retorna binario
                Return Bin.GetBuffer
            Else
                Return Nothing
            End If
        End Function
    End Class

    viernes, 21 de octubre de 2016 13:23
  • muchas gracias conevertirlo en un array me funciono, tambien tuve que cambiar el campo de blob a longblob, por que me marcaba un error mysql que los datos eram demasiado largos para la columna

    Private _foto_Equipo As Byte()
    Public Property foto_Equipo() As Byte()
            Get
                Return _foto_Equipo
            End Get
            Set(ByVal value As Byte())
                _foto_Equipo = value
            End Set
        End Property

    sábado, 22 de octubre de 2016 1:42