none
cargar imagen en un PictureBox RRS feed

  • Pregunta

  • Buenas a todos/as

    Programo en vb.net y uso MySQL

    Con este método actualizo, todo funciona bien hasta ahí.

    Using conexionx As New MySqlConnection(cadenaConexion)
                    conexionx.Open()
    
                    'Dim actualizar As String = "UPDATE tbla_compania  SET Nombre =@Nombre, Siglas =@Siglas, Eslogan =@Eslogan, Direccion =@Direccion, RNC =@RNC, Telefonos =@Telefonos, Sucursal =@Sucursal, Logo_Empresa =@Logo_Empresa WHERE CodigoConfigurarMiCompania =@CodigoConfigurarMiCompania"
                    Dim actualizar As String = "UPDATE tbla_compania  SET Nombre =@Nombre, Siglas =@Siglas, Eslogan =@Eslogan, Direccion =@Direccion, RNC =@RNC, Telefonos =@Telefonos, Sucursal =@Sucursal, Logo_Empresa =@Logo_Empresa WHERE CodigoConfigurarMiCompania =@CodigoConfigurarMiCompania"
    
                    Using comando As New MySqlCommand(actualizar, conexionx)
    
                        comando.Parameters.AddWithValue("@Nombre", TextNombre.Text.Trim())
                        comando.Parameters.AddWithValue("@Siglas", TextSiglas.Text.Trim())
                        comando.Parameters.AddWithValue("@Eslogan", TextEslogan.Text.Trim())
                        comando.Parameters.AddWithValue("@Direccion", TextDireccion.Text.Trim())
                        comando.Parameters.AddWithValue("@RNC", TextRNC.Text.Trim())
                        comando.Parameters.AddWithValue("@Telefonos", TextTelefonos.Text.Trim())
                        comando.Parameters.AddWithValue("@Sucursal", txtsucursal.Text.Trim())
    
                        ''Valor de Foto
                        If PictureBoxLogo_Empresa.Image Is Nothing Then
                            comando.Parameters.Add("@Logo_Empresa", MySqlDbType.Binary).Value = DBNull.Value
    
                        Else
                            Dim arrImage() As Byte, myMs As New IO.MemoryStream
                            PictureBoxLogo_Empresa.Image.Save(myMs, PictureBoxLogo_Empresa.Image.RawFormat)
                            arrImage = myMs.GetBuffer()
                            comando.Parameters.Add("@Logo_Empresa", MySqlDbType.Binary).Value = arrImage
                        End If
    
    
                        comando.Parameters.AddWithValue("@CodigoConfigurarMiCompania", Convert.ToInt64(txtCodigoComp.Text.Trim()))
                        comando.ExecuteNonQuery()
    
                    End Using
                End Using
    
                MsgBox("Para que los cambios surtan efecto, deberá cerrar y abrir el programa.", vbInformation, "Correcto")
    


    Con este método cargo los controles (aqui vienen los problemas)

     Public Sub CargarDatosControles()
            Using Conexion As New MySqlConnection(cadenaConexion)
                Conexion.Open()
    
                Dim consultaSQL As String = "Select Nombre, Siglas, Eslogan, Direccion, RNC, Telefonos, Sucursal, Logo_Empresa from tbla_compania WHERE CodigoConfigurarMiCompania =@CodigoConfigurarMiCompania"
                Dim comando As New MySqlCommand(consultaSQL, Conexion)
                comando.Parameters.AddWithValue("@CodigoConfigurarMiCompania", txtCodigoComp.Text)
    
                'LD=LectorDatos 
                Dim LD As MySqlDataReader
                LD = comando.ExecuteReader()
    
                If LD.Read() Then
                    'Establecemos valores de la asignación, en el mismo orden de los valores de la consulta
    
                    TextNombre.Text = LD.GetString(LD.GetOrdinal("Nombre"))
    
                    TextSiglas.Text = LD.GetString(LD.GetOrdinal("Siglas"))
    
                    TextEslogan.Text = LD.GetString(LD.GetOrdinal("Eslogan"))
    
                    TextDireccion.Text = LD.GetString(LD.GetOrdinal("Direccion"))
    
                    TextRNC.Text = LD.GetString(LD.GetOrdinal("RNC"))
    
                    TextTelefonos.Text = LD.GetString(LD.GetOrdinal("Telefonos"))
    
                    txtsucursal.Text = LD.GetString(LD.GetOrdinal("Sucursal"))
    
    
                    Dim data = LD.GetSByte(LD.GetOrdinal("Logo_Empresa"))
    
                    Dim stream = New MemoryStream(data)
                    PictureBoxLogo_Empresa.Image = Image.FromStream(stream)
    
                End If
            End Using
        End Sub

    todos los controles cargan bien, menos, el de cargar la imagen al 

    PictureBox

    muestra el siguiente error:

    sábado, 3 de noviembre de 2018 1:05

Respuestas

  • Otra solucion es que esa clase contiene item que te retorna el valoer segun el nombre de columna y indice 

    por lo que este ejemplo te deberia funcional sin problemas 

     Dim data() as byte = LD.Item(LD.GetOrdinal("Logo_Empresa"))
    
     Dim stream = New MemoryStream(data)
     PictureBoxLogo_Empresa.Image = Image.FromStream(stream)

    • Marcado como respuesta EliannyRD sábado, 3 de noviembre de 2018 21:32
    sábado, 3 de noviembre de 2018 16:33

Todas las respuestas

  • De que tipo es el campo en la base de datos, porque lo mas sencillo es hacerlo con dos funciones una que convierta las image a string y otra de string a image, que a mi me funciona guardarlas en base de datos en formato string

    en c# sera algo asi

    public static string ImagenTo_S(Image imageIn)
            {
                MemoryStream ms = new MemoryStream();
                imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                string base64String = Convert.ToBase64String(ms.ToArray());
                return base64String;
            }
            public static System.Drawing.Image S_ToImage(string StringBase)
            {
                System.Drawing.Image img = null;
                if (!string.IsNullOrEmpty(StringBase))
                {
                    byte[] Pd = Convert.FromBase64String(StringBase);
                    MemoryStream memstr = new MemoryStream(Pd);
                    img = System.Drawing.Image.FromStream(memstr);

                }
                return img;
            }

    sábado, 3 de noviembre de 2018 1:50
  • Hola:
    Prueba con este código

       lP_MostrarLogo(txtCodigoComp.Text)

        Private Sub lP_MostrarLogo(ByVal vsCodigoConfigurarMiCompania As String)
            Try
                Dim loResultado As Object
                ' crear sentencia, conexión y comando para obtener la imagen de la base de datos
                Dim lsQuery As String = "SELECT Logo_Empresa FROM tbla_compania WHERE CodigoConfigurarMiCompania=@Codigo"
                Using loConexion As New MySqlConnection(cadenaConexion)
                    loConexion.Open()
                    ' crear comando
                    Using loComando As New MySqlCommand(lsQuery, loConexion)
                        loComando.Parameters.Add(New MySqlParameter("@Codigo", vsCodigoConfigurarMiCompania))
                        loResultado = loComando.ExecuteScalar()
                        If IsDBNull(loResultado) = True Then
                            Me.PictureBoxLogo_Empresa.Image = Nothing
                        Else
                            Dim aBytImagen As Byte() = CType(loResultado, Byte())
                            Me.PictureBoxLogo_Empresa.Image = Image.FromStream(lF_ByteArrayToStream(aBytImagen))
                        End If
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lP_MostrarLogo", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub

        Private Function lF_ByteArrayToStream(ByVal Array As Byte()) As Stream
            ' crear un objeto stream en memoria conteniendo los datos del array de bytes
            Dim oMemoryStream As MemoryStream = New MemoryStream(Array)
            Return oMemoryStream
        End Function

    Un saludo desde Bilbo
    Carlos


    sábado, 3 de noviembre de 2018 8:15
  • gracias a todos por contestar 

    el tipo de dato del campo: Logo_Empresa esblob

    estoy probando el código de: Editado J. Carlos Herrero, pero tiene un error en la primera linea de codigo:  lP_MostrarLogo(txtCodigoComp.Text), dise que se esperaba declararlo. 

    ademas y como llamo el procedimiento

    me podrían explicar una forma mas sencilla, es posible



    • Editado EliannyRD sábado, 3 de noviembre de 2018 13:00
    sábado, 3 de noviembre de 2018 12:52
  • porque no quitas esta variable

     Dim data = LD.GetSByte(LD.GetOrdinal("Logo_Empresa"))

    y esta 

     Dim stream = New MemoryStream(data)

    la cambias por esto 

     Dim stream = LD.GetStream(LD.GetOrdinal("Logo_Empresa"))

    sábado, 3 de noviembre de 2018 13:11
  • gracias por contestar, 

    dice que 

    GetStream: no es un miembro de mysqldasta
    sábado, 3 de noviembre de 2018 14:11
  • Que raro porque a si es como yo obtengo la imagen de la base de datos pero bueno si eso no te funciona escribe esto

     Dim data = LD.GetSqlBinary(LD.GetOrdinal("Logo_Empresa"))
    
                    Dim stream = New MemoryStream(data.Value)
                    PictureBoxLogo_Empresa.Image = Image.FromStream(stream)

     
    sábado, 3 de noviembre de 2018 14:42
  • gracias por dar seguimiento a mi caso

    dice GetSqlBinary, no es miembro de MySqldata

    quizás es porque yo uso como base de datos mysql y quizás tu usas sql serever

    ESTE es listado de los get que me salen.

    • Editado EliannyRD sábado, 3 de noviembre de 2018 16:17
    sábado, 3 de noviembre de 2018 16:08
  • algo anda mal porque la clase  MySqldataReader si tiene esas funciones 

    MySqldataReader.GetStream(int ordinal) si es un miembro de esa clase mira a ver si lo pusiste mal

    entra en este link y mira los mienbros de la clase y veras que si esta hay

    MySqlDataReader

    sábado, 3 de noviembre de 2018 16:24
  • Otra solucion es que esa clase contiene item que te retorna el valoer segun el nombre de columna y indice 

    por lo que este ejemplo te deberia funcional sin problemas 

     Dim data() as byte = LD.Item(LD.GetOrdinal("Logo_Empresa"))
    
     Dim stream = New MemoryStream(data)
     PictureBoxLogo_Empresa.Image = Image.FromStream(stream)

    • Marcado como respuesta EliannyRD sábado, 3 de noviembre de 2018 21:32
    sábado, 3 de noviembre de 2018 16:33
  • Resuelto 100x%

    Gracias, por todo, gracias.............................

    solo tengo otra pregunta si es posible: 

    supongamos que el campo Logo Empresa esta vacío, es decir que no tiene ninguna imagen almacenada, al momento de cargar da este error. 

    • Editado EliannyRD sábado, 3 de noviembre de 2018 17:59
    sábado, 3 de noviembre de 2018 17:13
  • verifica que cuando creaste la tabla en la base de datos que en el campo de tipo imagen pusiste que  no aceptara 

    valores null por lo tanto si el valor es null te da error

    sábado, 3 de noviembre de 2018 18:00
  • ya verifique, el campo acepta valores nulos 

    supongamos que el campo Logo Empresa esta vacío, es decir que no tiene ninguna imagen almacenada, al momento de cargar da error porque no puede cargar el campo Logo Empresa si esta vacío.

    ahora bien si tiene la imagen almacenada, si carga bien,

    sábado, 3 de noviembre de 2018 18:10
  • ok no debería ser  a si  pero otra solucion seria me imagino que extraes la imagen atraves de un boton

    usando el openfiledialog y la ruta se la pasas a una variable lo que tienes que hacer es crear una condicion

    por ejemplo si la variable imagen es nothing osea nulo creas una imagen  de este modo

    ''Valor de Foto If PictureBoxLogo_Empresa.Image Is Nothing Then

    Dim imagen As New Bitmap(50, 50) comando.Parameters.Add("@Logo_Empresa", MySqlDbType.Binary).Value = imagen Else Dim arrImage() As Byte, myMs As New IO.MemoryStream PictureBoxLogo_Empresa.Image.Save(myMs, PictureBoxLogo_Empresa.Image.RawFormat) arrImage = myMs.GetBuffer() comando.Parameters.Add("@Logo_Empresa", MySqlDbType.Binary).Value = arrImage End If

    aunque no muestre una imagen pero no te la va a reconocer como nulo

    y se la pasas al campo espero me comprendas 


    • Editado DANTE-3D sábado, 3 de noviembre de 2018 18:50
    sábado, 3 de noviembre de 2018 18:46
  • buenas

    hice los cambios que me dijiste y ahora sale este error


    • Editado EliannyRD sábado, 3 de noviembre de 2018 19:18
    sábado, 3 de noviembre de 2018 18:57
  • Si pero recuerda que ese campo acepta valores nulos y aun a si te da error es mejor crear una imagen en blanco 

    y pasársela como parámetro aunque el usuario no seleccione una imagen ese campo no estará vació  

    sábado, 3 de noviembre de 2018 19:21
  • Hola:
    En un Form con 1 DataGridView, 1 label y 1 PictureBox, copia y pega el siguiente código

    Option Strict On
    Option Explicit On
    Imports System.Data.SqlClient
    Imports System.IO
    Public Class Form1
        Private moDataTable As New DataTable
        Private msCadenaSQL As String = "Data Source=.\SQLEXPRESS;Initial Catalog=TU_BASE_DE_DATOS;Integrated Security=True"
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
            Try
            Dim lsQuery As String = "SELECT id_usuario FROM usuario ORDER BY id_usuario"
                Using loConexion As New SqlConnection(msCadenaSQL)
                    Using loDataAdapter As New SqlDataAdapter(lsQuery, loConexion)
                        loDataAdapter.Fill(moDataTable)
                    End Using
                End Using
                Me.DataGridView1.DataSource = moDataTable
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        Private Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
            If e.RowIndex = -1 Then
                Return
            End If
            Dim loFila As DataGridViewRow = Me.DataGridView1.CurrentRow()
            Me.Label1.Text = loFila.Cells("id_usuario").Value.ToString()
            lP_MostrarFoto(loFila.Cells("id_usuario").Value.ToString())
        End Sub
        Private Sub lP_MostrarFoto(ByVal vsid As String)
            Try
                Dim loResultado As Object
                ' crear sentencia, conexión y comando para obtener la imagen de la base de datos
                Dim lsQuery As String = "SELECT foto FROM usuario WHERE id_usuario=@id"
                Using loConexion As New SqlConnection(msCadenaSQL)
                    loConexion.Open()
                    ' crear comando
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        loComando.Parameters.Add(New SqlParameter("@id", vsid))
                        loResultado = loComando.ExecuteScalar()
                        If IsDBNull(loResultado) = True Then
                            Me.PictureBox1.Image = Nothing
                        Else
                            Dim aBytImagen As Byte() = CType(loResultado, Byte())
                            Me.PictureBox1.Image = Image.FromStream(lF_ByteArrayToStream(aBytImagen))
                        End If
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lP_MostrarFoto", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub

        Private Function lF_ByteArrayToStream(ByVal Array As Byte()) As Stream
            ' crear un objeto stream en memoria conteniendo los datos del array de bytes
            Dim oMemoryStream As MemoryStream = New MemoryStream(Array)
            Return oMemoryStream
        End Function
    End Class

    El resultado es.


    P.D.
    El campo foto es varbinary(max)

    Un saludo desde Bilbo
    Carlos

    sábado, 3 de noviembre de 2018 22:02
  • Jejejej que lio  lo raro es que ami me funciona

    Valor de Foto If PictureBoxLogo_Empresa.Image Is Nothing Then

    Dim imagen As New Bitmap(50, 50)

    PictureBoxLogo_Empresa.Image = imagen Dim arrImage() As Byte, myMs As New IO.MemoryStream PictureBoxLogo_Empresa.Image.Save(myMs, PictureBoxLogo_Empresa.Image.RawFormat) arrImage = myMs.GetBuffer() comando.Parameters.Add("@Logo_Empresa", MySqlDbType.Binary).Value = arrImage Else Dim arrImage() As Byte, myMs As New IO.MemoryStream PictureBoxLogo_Empresa.Image.Save(myMs, PictureBoxLogo_Empresa.Image.RawFormat) arrImage = myMs.GetBuffer() comando.Parameters.Add("@Logo_Empresa", MySqlDbType.Binary).Value = arrImage End If

    domingo, 4 de noviembre de 2018 1:57
  • Gracias a todos por sus respuestas

    resuelto todo, 100x%

    el código me quedo así: 

    Using conexionx As New MySqlConnection(cadenaConexion)
                    conexionx.Open()
    
                    Dim actualizar As String = "UPDATE tbla_compania  SET Nombre =@Nombre, Siglas =@Siglas, Eslogan =@Eslogan, Direccion =@Direccion, RNC =@RNC, Telefonos =@Telefonos, Sucursal =@Sucursal, Logo_Empresa =@Logo_Empresa WHERE CodigoConfigurarMiCompania =@CodigoConfigurarMiCompania"
    
                    Using comando As New MySqlCommand(actualizar, conexionx)
    
                        comando.Parameters.AddWithValue("@Nombre", TextNombre.Text.Trim())
                        comando.Parameters.AddWithValue("@Siglas", TextSiglas.Text.Trim())
                        comando.Parameters.AddWithValue("@Eslogan", TextEslogan.Text.Trim())
                        comando.Parameters.AddWithValue("@Direccion", TextDireccion.Text.Trim())
                        comando.Parameters.AddWithValue("@RNC", TextRNC.Text.Trim())
                        comando.Parameters.AddWithValue("@Telefonos", TextTelefonos.Text.Trim())
                        comando.Parameters.AddWithValue("@Sucursal", txtsucursal.Text.Trim())
    
                        ''Valor de Foto
                        If PictureBoxLogo_Empresa.Image Is Nothing Then
                            comando.Parameters.Add("@Logo_Empresa", MySqlDbType.Binary).Value = DBNull.Value
    
                        Else
                            Dim arrImage() As Byte, myMs As New IO.MemoryStream
                            PictureBoxLogo_Empresa.Image.Save(myMs, PictureBoxLogo_Empresa.Image.RawFormat)
                            arrImage = myMs.GetBuffer()
                            comando.Parameters.Add("@Logo_Empresa", MySqlDbType.Binary).Value = arrImage
                        End If
    
    
                        comando.Parameters.AddWithValue("@CodigoConfigurarMiCompania", Convert.ToInt64(txtCodigoComp.Text.Trim()))
                        comando.ExecuteNonQuery()
    
                    End Using
                End Using
    
    

    Public Sub CargarDatosControles()
            Using Conexion As New MySqlConnection(cadenaConexion)
                Conexion.Open()
    
                Dim consultaSQL As String = "Select Nombre, Siglas, Eslogan, Direccion, RNC, Telefonos, Sucursal, Logo_Empresa from tbla_compania WHERE CodigoConfigurarMiCompania =@CodigoConfigurarMiCompania"
                Dim comando As New MySqlCommand(consultaSQL, Conexion)
                comando.Parameters.AddWithValue("@CodigoConfigurarMiCompania", txtCodigoComp.Text)
    
                'LD=LectorDatos 
                Dim LD As MySqlDataReader
                LD = comando.ExecuteReader()
    
                If LD.Read() Then
                    'Establecemos valores de la asignación, en el mismo orden de los valores de la consulta
    
                    TextNombre.Text = LD.GetString(LD.GetOrdinal("Nombre"))
    
                    TextSiglas.Text = LD.GetString(LD.GetOrdinal("Siglas"))
    
                    TextEslogan.Text = LD.GetString(LD.GetOrdinal("Eslogan"))
    
                    TextDireccion.Text = LD.GetString(LD.GetOrdinal("Direccion"))
    
                    TextRNC.Text = LD.GetString(LD.GetOrdinal("RNC"))
    
                    TextTelefonos.Text = LD.GetString(LD.GetOrdinal("Telefonos"))
    
                    txtsucursal.Text = LD.GetString(LD.GetOrdinal("Sucursal"))
    
                    If LD.IsDBNull(LD.GetOrdinal("Logo_Empresa")) Then
                        ' SI la información encontrada es nula, no cargar imagen.  
    
                    Else ' De lo contrario, si cargar imagen 
                        Dim data() As Byte = LD.Item(LD.GetOrdinal("Logo_Empresa"))
                        Dim stream = New MemoryStream(data)
                        PictureBoxLogo_Empresa.Image = Image.FromStream(stream)
    
                    End If
                End If
            End Using
        End Sub
    

    domingo, 4 de noviembre de 2018 19:30