none
Visualizar imagenes almacenadas en SQL Server en un PictureBox RRS feed

  • Pregunta

  • Hola, la idea es la siguiente...  ya tengo un mantenimiento de usuario con imagenes donde puedo consultar imagenes almacenas en sql, borrarla,buscarla,insertarla,etc. En el login tengo un ComboBox donde me almacena el nombre de usuario. dicho login tiene un pictureBox por el momento bacio.

    !Lo que quiero hacer es que al seleccionar uno de los usuarios que tienen su foto en la base de datos,  me lo muestre en un pictureBox, me inmagino que hay que convertir la imagen almacena de Bytes a imagen y demas procedimientos pero como puedo lograr esto?


    domingo, 15 de mayo de 2016 6:01

Respuestas

  • Hola:
    En un Form con 1 ComboBox y 1 Pictureox, copia y pega el siguiente codigo
    Option Strict On
    Option Explicit On
    Imports System.Data.SqlClient
    Imports System.IO
    Public Class Form1
        Private msCadConexion 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
            'Carga del ComboBox
            Me.cboUsuario.Items.Add("1 - PRIMERO")
            Me.cboUsuario.Items.Add("2 - SEGUNDO")
            Me.cboUsuario.Items.Add("3 - TERCERO")
        End Sub
        Private Sub cboUsuario_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles cboUsuario.SelectionChangeCommitted
            lP_MostrarFoto("Select TU_CAMPO_IMAGEN From TU_TABLA Where ID=" & CStr(Me.cboUsuario.SelectedIndex + 1))
        End Sub
        Private Sub lP_MostrarFoto(ByVal vsQuery As String)
            Try
                Dim loResultado As Object
                ' crear sentencia, conexión y comando para obtener la imagen de la base de datos
                Using loConexion As New SqlConnection(msCadConexion)
                    ' crear comando
                    Using loComando As New SqlCommand(vsQuery, loConexion)
                        loConexion.Open()
                        loResultado = loComando.ExecuteScalar()
                        If IsDBNull(loResultado) = True Then
                            Me.picFoto.Image = Nothing
                        Else
                            Dim aBytImagen As Byte() = CType(loResultado, Byte())
                            Me.picFoto.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)
                Return
            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
        Private Function lF_ImagenToByteArray(ByVal Imagen As System.Drawing.Image) As Byte()
            ' crear un objeto array de bytes en memoria conteniendo los datos de la imagen
            Dim oMemoryStream As New MemoryStream()
            Imagen.Save(oMemoryStream, System.Drawing.Imaging.ImageFormat.Jpeg)
            Return oMemoryStream.ToArray()
        End Function

    End Class

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Renzo19 domingo, 15 de mayo de 2016 8:29
    domingo, 15 de mayo de 2016 6:34
  • Hola:
    En un Form con 1 ComboBox y 1 PictureBox, copia y pega el siguiente codigo
    Option Explicit On
    Option Strict On
    Imports System.Data.SqlClient
    Imports System.IO
    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
            Me.PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
            Me.ComboBox1.Items.Add("")
            Me.ComboBox1.Items.Add("PRIMER USUARIO")
            Me.ComboBox1.Items.Add("SEGUNDO USUARIO")
        End Sub

        Private Sub ComboBox1_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox1.SelectionChangeCommitted

    'AQUI ES DONDE ENTRA EN JUEGO EL COMBOBOX

    Esta pregunta esta respondida en el siguiente enlace

    https://social.msdn.microsoft.com/Forums/es-ES/37a11cfe-239b-4b8b-b432-54e2a228fffe/visualizar-imagenes-almacenadas-en-sql-server-en-un-picturebox?forum=vbes

            If Me.ComboBox1.Text.Length = 0 Then
                Me.PictureBox1.Image = Nothing
            Else
                lP_MostrarFoto()
            End If
        End Sub

        Private Sub lP_MostrarFoto()
            Try
                Dim loResultado As Object
                Dim msCadena As String = "Data Source=.\SQLEXPRESS;Initial Catalog=TU_BASE_DE_DATOS;Integrated Security=True"
                Dim lsQuery As String = "Select TU_CAMPO_IMAGEN From TU_TABLA Where ID=" & Me.ComboBox1.SelectedIndex.ToString
                ' crear sentencia, conexión y comando para obtener la imagen de la base de datos
                Using loConexion As New SqlConnection(msCadena)
                    ' crear comando
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        loConexion.Open()
                        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(gF_ByteArrayToStream(aBytImagen))
                        End If
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lP_MostrarFoto", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return
            End Try
        End Sub

        Private Function gF_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

    Un saludo desde Bilbo
    Carlos

    • Editado J. Carlos Herrero martes, 14 de junio de 2016 6:08
    • Marcado como respuesta Renzo19 viernes, 17 de junio de 2016 6:07
    martes, 14 de junio de 2016 6:02
  • Hola:
    Lo que te he expuesto es un ejemplo. En la vida real, el combobox se carga con los datos de una tabla de usuarios.
    Ejemplo
            Try
                Dim lsCadConexion As String = "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"
                Using loConexion As New SqlConnection(lsCadConexion)
                    Dim lsQuery As String = "Select EmployeeID, LastName From Employees Order By LastName"
                    Dim loDataAdapter As New SqlClient.SqlDataAdapter(lsQuery, loConexion)
                    Dim loDataTable As New DataTable
                    loDataAdapter.Fill(loDataTable)
                    cboDatatable.DisplayMember = "LastName"
                    cboDatatable.ValueMember = "EmployeeID"
                    cboDatatable.DataSource = loDataTable
                    Me.cboDatatable.SelectedIndex = -1
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    Cuando se busca el ID del usuario, se toma el valuemember del item del combo seleccionado.
    Tendras que cambiar esta linea
    Dim lsQuery As String = "Select TU_CAMPO_IMAGEN From TU_TABLA Where ID=" & Me.ComboBox1.SelectedIndex.ToString
    por esta otra
    Dim lsQuery As String = "Select TU_CAMPO_IMAGEN From TU_TABLA Where ID=" & Me.ComboBox1.SelectedValue.ToString

    <Me gustaría hacerlo de tal forma que el campo Foto se enlace directamente al campo Nombre y no al ID>
    Totalmente erróneo

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Renzo19 viernes, 17 de junio de 2016 6:07
    miércoles, 15 de junio de 2016 4:50
  • Hola:
    Para cargar el combobox ejecutas la siguiente consulta
    Select Nombre From [Tabla de gabriel]
    Luego pones como valuemember el campo ID en la siguiente instruccion ComboBox1.ValueMember = "ID"
    ¿Porque no incluyes ese campo ID en la consulta?

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Renzo19 viernes, 17 de junio de 2016 6:06
    jueves, 16 de junio de 2016 5:34
  • Hola:
    Para poder finalizar esta conversacion, ¿Puedes poner la estructura de la tabla llamada Tabla de gabriel?

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Renzo19 jueves, 16 de junio de 2016 15:20
    • Desmarcado como respuesta Renzo19 jueves, 16 de junio de 2016 15:20
    • Marcado como respuesta Renzo19 jueves, 16 de junio de 2016 15:56
    jueves, 16 de junio de 2016 6:46
  • Hola:
    Para este ejemplo, he creado una tabla con la siguiente estructura para abreviar (los demas campos no intervienen en el ejemplo)
    CREATE TABLE [TABLA_GABRIEL] (
     [ID] [int] NOT NULL ,
     [NOMBRE] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
     [FOTO] [varbinary] (Max) NOT NULL ,
     CONSTRAINT [PK_TABLA_GABRIEL] PRIMARY KEY  CLUSTERED
     (
      [ID]
     )  ON [PRIMARY]
    ) ON [PRIMARY]
    En un Form con 1 ComboBox y 1 PictureBox, copia y pega el siguiente codigo
    Option Strict On
    Option Explicit On
    Imports System.Data.SqlClient
    Imports System.IO

    Public Class Form1
        Private msCadConexion 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.cboUsuario.DropDownStyle = ComboBoxStyle.DropDownList
            Me.picFoto.SizeMode = PictureBoxSizeMode.StretchImage
            'Carga del ComboBox
            Try
                Using loConexion As New SqlConnection(msCadConexion)
                    Dim lsQuery As String = "Select ID, NOMBRE From TABLA_GABRIEL Order By NOMBRE"
                    Dim loDataAdapter As New SqlClient.SqlDataAdapter(lsQuery, loConexion)
                    Dim loDataTable As New DataTable
                    loDataAdapter.Fill(loDataTable)
                    Me.cboUsuario.DataSource = loDataTable
                    Me.cboUsuario.DisplayMember = "NOMBRE"
                    Me.cboUsuario.ValueMember = "ID"
                    Me.cboUsuario.SelectedIndex = -1
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
        Private Sub cboUsuario_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles cboUsuario.SelectionChangeCommitted
            lP_MostrarFoto("Select FOTO From TABLA_GABRIEL Where ID=" & CStr(Me.cboUsuario.SelectedValue))
        End Sub
        Private Sub lP_MostrarFoto(ByVal vsQuery As String)
            Try
                Dim loResultado As Object
                ' crear sentencia, conexión y comando para obtener la imagen de la base de datos
                Using loConexion As New SqlConnection(msCadConexion)
                    ' crear comando
                    Using loComando As New SqlCommand(vsQuery, loConexion)
                        loConexion.Open()
                        loResultado = loComando.ExecuteScalar()
                        If IsDBNull(loResultado) = True Then
                            Me.picFoto.Image = Nothing
                        Else
                            Dim aBytImagen As Byte() = CType(loResultado, Byte())
                            Me.picFoto.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)
                Return
            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

        Private Function lF_ImagenToByteArray(ByVal Imagen As System.Drawing.Image) As Byte()
            ' crear un objeto array de bytes en memoria conteniendo los datos de la imagen
            Dim oMemoryStream As New MemoryStream()
            Imagen.Save(oMemoryStream, System.Drawing.Imaging.ImageFormat.Jpeg)
            Return oMemoryStream.ToArray()
        End Function
    End Class

    Imagen del ejemplo

    P.D.
    No hace falta revisar algo tan elemental como esto.
    Prueba en un proyecto nuevo este ejemplo y una vez que comprendas como funciona, lo adaptas al tuyo real.

    Un saludo desde Bilbo
    Carlos

    • Editado J. Carlos Herrero jueves, 16 de junio de 2016 19:29
    • Marcado como respuesta Renzo19 viernes, 17 de junio de 2016 6:06
    jueves, 16 de junio de 2016 19:25
  • Hola:
    En el Load tienes la siguiente instruccion
    Me.cboUsuario.SelectedIndex = -1
    Esto lo que hace es que el combobox inicialmente NO tenga ningun item seleccionado
    Si quieres que se seleccione alguno en particular, cambia el -1 por otro numero y despues inserta una linea con la siguiente instruccion
    lP_MostrarFoto("Select FOTO From TABLA_GABRIEL Where ID=" & CStr(Me.cboUsuario.SelectedValue))

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Renzo19 viernes, 17 de junio de 2016 6:06
    viernes, 17 de junio de 2016 5:45

Todas las respuestas

  • Hola:
    En un Form con 1 ComboBox y 1 Pictureox, copia y pega el siguiente codigo
    Option Strict On
    Option Explicit On
    Imports System.Data.SqlClient
    Imports System.IO
    Public Class Form1
        Private msCadConexion 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
            'Carga del ComboBox
            Me.cboUsuario.Items.Add("1 - PRIMERO")
            Me.cboUsuario.Items.Add("2 - SEGUNDO")
            Me.cboUsuario.Items.Add("3 - TERCERO")
        End Sub
        Private Sub cboUsuario_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles cboUsuario.SelectionChangeCommitted
            lP_MostrarFoto("Select TU_CAMPO_IMAGEN From TU_TABLA Where ID=" & CStr(Me.cboUsuario.SelectedIndex + 1))
        End Sub
        Private Sub lP_MostrarFoto(ByVal vsQuery As String)
            Try
                Dim loResultado As Object
                ' crear sentencia, conexión y comando para obtener la imagen de la base de datos
                Using loConexion As New SqlConnection(msCadConexion)
                    ' crear comando
                    Using loComando As New SqlCommand(vsQuery, loConexion)
                        loConexion.Open()
                        loResultado = loComando.ExecuteScalar()
                        If IsDBNull(loResultado) = True Then
                            Me.picFoto.Image = Nothing
                        Else
                            Dim aBytImagen As Byte() = CType(loResultado, Byte())
                            Me.picFoto.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)
                Return
            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
        Private Function lF_ImagenToByteArray(ByVal Imagen As System.Drawing.Image) As Byte()
            ' crear un objeto array de bytes en memoria conteniendo los datos de la imagen
            Dim oMemoryStream As New MemoryStream()
            Imagen.Save(oMemoryStream, System.Drawing.Imaging.ImageFormat.Jpeg)
            Return oMemoryStream.ToArray()
        End Function

    End Class

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Renzo19 domingo, 15 de mayo de 2016 8:29
    domingo, 15 de mayo de 2016 6:34
  • Una vez que tienes los datos recuperados en un array de bytes simplemente tendrías que crear un MemoryStream a partir del array y cargar la imagen a partir del Stream:

    Dim imgStream As New MemoryStream(imageBytes)
    pictureBox1.Image = Image.FromStream(imgStream)

    Puedes echar un vistazo a este artículo en el que está muy bien explicado, tanto la carga en base de datos como la recuperación:

    Cómo mostrar una imagen desde una base de datos en un PictureBox de formularios Windows Forms mediante Visual Basic. NET


    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, ...

    domingo, 15 de mayo de 2016 6:40
  • y en que parte entra en juego el ComboBox?
    martes, 14 de junio de 2016 3:54
  • Hola, la idea es la siguiente...  ya tengo un mantenimiento de usuario con imágenes donde puedo consultar imágenes almacenas en Sql; borrarla, buscarla, insertarla, etc. En el login tengo un ComboBox donde me almacena el nombre de usuario que esta en Sql Server. Dicho login tiene un PictureBox por el momento vacio.

    !Lo que quiero hacer es que al seleccionar uno de los usuarios que tienen su foto en la base de datos,  me lo muestre en un PictureBox, pero como puedo lograr esto?

    Gracias!

    martes, 14 de junio de 2016 4:45
  • Hola:
    En un Form con 1 ComboBox y 1 PictureBox, copia y pega el siguiente codigo
    Option Explicit On
    Option Strict On
    Imports System.Data.SqlClient
    Imports System.IO
    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
            Me.PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
            Me.ComboBox1.Items.Add("")
            Me.ComboBox1.Items.Add("PRIMER USUARIO")
            Me.ComboBox1.Items.Add("SEGUNDO USUARIO")
        End Sub

        Private Sub ComboBox1_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox1.SelectionChangeCommitted

    'AQUI ES DONDE ENTRA EN JUEGO EL COMBOBOX

    Esta pregunta esta respondida en el siguiente enlace

    https://social.msdn.microsoft.com/Forums/es-ES/37a11cfe-239b-4b8b-b432-54e2a228fffe/visualizar-imagenes-almacenadas-en-sql-server-en-un-picturebox?forum=vbes

            If Me.ComboBox1.Text.Length = 0 Then
                Me.PictureBox1.Image = Nothing
            Else
                lP_MostrarFoto()
            End If
        End Sub

        Private Sub lP_MostrarFoto()
            Try
                Dim loResultado As Object
                Dim msCadena As String = "Data Source=.\SQLEXPRESS;Initial Catalog=TU_BASE_DE_DATOS;Integrated Security=True"
                Dim lsQuery As String = "Select TU_CAMPO_IMAGEN From TU_TABLA Where ID=" & Me.ComboBox1.SelectedIndex.ToString
                ' crear sentencia, conexión y comando para obtener la imagen de la base de datos
                Using loConexion As New SqlConnection(msCadena)
                    ' crear comando
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        loConexion.Open()
                        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(gF_ByteArrayToStream(aBytImagen))
                        End If
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lP_MostrarFoto", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return
            End Try
        End Sub

        Private Function gF_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

    Un saludo desde Bilbo
    Carlos

    • Editado J. Carlos Herrero martes, 14 de junio de 2016 6:08
    • Marcado como respuesta Renzo19 viernes, 17 de junio de 2016 6:07
    martes, 14 de junio de 2016 6:02
  • Carlos, tu código esta muy bien, el problema es que muestra el campo foto de acuerdo a la posición que tenga el usuario; la desventaja de esto es que si borro un registro y el id cambia o no hay un id constante 1,2,3,4 si esto no se da y esta algo asi 1,4,8,15,24,45 así desordenado pues no mostrara la foto y dirá error de buff no puede ser nulo, ya lo he probado y por eso lo digo. Me gustaría hacerlo de tal forma que el campo Foto se enlace directamente al campo Nombre y no al ID me entiendes ahora? Gracias!

    miércoles, 15 de junio de 2016 4:40
  • Hola:
    Lo que te he expuesto es un ejemplo. En la vida real, el combobox se carga con los datos de una tabla de usuarios.
    Ejemplo
            Try
                Dim lsCadConexion As String = "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"
                Using loConexion As New SqlConnection(lsCadConexion)
                    Dim lsQuery As String = "Select EmployeeID, LastName From Employees Order By LastName"
                    Dim loDataAdapter As New SqlClient.SqlDataAdapter(lsQuery, loConexion)
                    Dim loDataTable As New DataTable
                    loDataAdapter.Fill(loDataTable)
                    cboDatatable.DisplayMember = "LastName"
                    cboDatatable.ValueMember = "EmployeeID"
                    cboDatatable.DataSource = loDataTable
                    Me.cboDatatable.SelectedIndex = -1
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    Cuando se busca el ID del usuario, se toma el valuemember del item del combo seleccionado.
    Tendras que cambiar esta linea
    Dim lsQuery As String = "Select TU_CAMPO_IMAGEN From TU_TABLA Where ID=" & Me.ComboBox1.SelectedIndex.ToString
    por esta otra
    Dim lsQuery As String = "Select TU_CAMPO_IMAGEN From TU_TABLA Where ID=" & Me.ComboBox1.SelectedValue.ToString

    <Me gustaría hacerlo de tal forma que el campo Foto se enlace directamente al campo Nombre y no al ID>
    Totalmente erróneo

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Renzo19 viernes, 17 de junio de 2016 6:07
    miércoles, 15 de junio de 2016 4:50
  • Mira, este es el código completo al parecer algo estoy haciendo mal porque al correr el programa no aparece la imagen y cuando cambio de usuario en el combobox sale: El identificador formado por varias partes: "System.Data.DataRowView" no se puedo enlazar.

    Option Explicit On
    Option Strict On
    Imports System.Data.SqlClient
    Imports System.IO
    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
            Me.PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
          
            Try
                Dim lsCadConexion As String = "Data Source=.;Initial Catalog=Gabriel;Integrated Security=True"
                Using loConexion As New SqlConnection(lsCadConexion)
                    Dim lsQuery As String = "Select Nombre From [Tabla de gabriel]"
                    Dim loDataAdapter As New SqlClient.SqlDataAdapter(lsQuery, loConexion)
                    Dim loDataTable As New DataTable
                    loDataAdapter.Fill(loDataTable)
                    ComboBox1.DisplayMember = "Nombre"
                    ComboBox1.ValueMember = "ID"
                    ComboBox1.DataSource = loDataTable
                    Me.ComboBox1.SelectedIndex = -1
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
        Private Sub ComboBox1_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox1.SelectionChangeCommitted

            'AQUI ES DONDE ENTRA EN JUEGO EL COMBOBOX


            If Me.ComboBox1.Text.Length = 0 Then
                Me.PictureBox1.Image = Nothing
            Else
                lP_MostrarFoto()
            End If
        End Sub

        Private Sub lP_MostrarFoto()
            Try
                Dim loResultado As Object
                Dim msCadena As String = "Data Source=.;Initial Catalog=Gabriel;Integrated Security=True"
                Dim lsQuery As String = "Select Foto From [Tabla de gabriel] Where ID=" & Me.ComboBox1.SelectedValue.ToString
                ' crear sentencia, conexión y comando para obtener la imagen de la base de datos
                Using loConexion As New SqlConnection(msCadena)
                    ' crear comando
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        loConexion.Open()
                        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(gF_ByteArrayToStream(aBytImagen))
                        End If
                    End Using
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lP_MostrarFoto", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return
            End Try
        End Sub
        Private Function gF_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

    jueves, 16 de junio de 2016 4:42
  • Hola:
    Para cargar el combobox ejecutas la siguiente consulta
    Select Nombre From [Tabla de gabriel]
    Luego pones como valuemember el campo ID en la siguiente instruccion ComboBox1.ValueMember = "ID"
    ¿Porque no incluyes ese campo ID en la consulta?

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Renzo19 viernes, 17 de junio de 2016 6:06
    jueves, 16 de junio de 2016 5:34
  • En que consulta?
    jueves, 16 de junio de 2016 5:56
  • Hola:
    Para poder finalizar esta conversacion, ¿Puedes poner la estructura de la tabla llamada Tabla de gabriel?

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Renzo19 jueves, 16 de junio de 2016 15:20
    • Desmarcado como respuesta Renzo19 jueves, 16 de junio de 2016 15:20
    • Marcado como respuesta Renzo19 jueves, 16 de junio de 2016 15:56
    jueves, 16 de junio de 2016 6:46
  • Estructura de la Tabla

    ID, Nombre, Contraseña, Foto, Estado Civil, Género, Nivel, Edad, Nacimiento

    ID es la llave primaria de tipo int, Nombre varchar, Contraseña Varchar, Foto es image, Estado Civil varchar, Género varchar, Nivel Varchar, Edad int, Nacimiento date.

    En total esa tabla tiene 6 registros c/u con imagen, almacenadas en binario en el campo Foto


    • Editado Renzo19 jueves, 16 de junio de 2016 15:27
    jueves, 16 de junio de 2016 15:25
  • Tienes un correo o una red social donde podamos hablar? Pienso que seria mas fácil si te mando el proyecto y tu le hechas un ojo 
    jueves, 16 de junio de 2016 15:26
  • Hola:
    Para este ejemplo, he creado una tabla con la siguiente estructura para abreviar (los demas campos no intervienen en el ejemplo)
    CREATE TABLE [TABLA_GABRIEL] (
     [ID] [int] NOT NULL ,
     [NOMBRE] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
     [FOTO] [varbinary] (Max) NOT NULL ,
     CONSTRAINT [PK_TABLA_GABRIEL] PRIMARY KEY  CLUSTERED
     (
      [ID]
     )  ON [PRIMARY]
    ) ON [PRIMARY]
    En un Form con 1 ComboBox y 1 PictureBox, copia y pega el siguiente codigo
    Option Strict On
    Option Explicit On
    Imports System.Data.SqlClient
    Imports System.IO

    Public Class Form1
        Private msCadConexion 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.cboUsuario.DropDownStyle = ComboBoxStyle.DropDownList
            Me.picFoto.SizeMode = PictureBoxSizeMode.StretchImage
            'Carga del ComboBox
            Try
                Using loConexion As New SqlConnection(msCadConexion)
                    Dim lsQuery As String = "Select ID, NOMBRE From TABLA_GABRIEL Order By NOMBRE"
                    Dim loDataAdapter As New SqlClient.SqlDataAdapter(lsQuery, loConexion)
                    Dim loDataTable As New DataTable
                    loDataAdapter.Fill(loDataTable)
                    Me.cboUsuario.DataSource = loDataTable
                    Me.cboUsuario.DisplayMember = "NOMBRE"
                    Me.cboUsuario.ValueMember = "ID"
                    Me.cboUsuario.SelectedIndex = -1
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
        Private Sub cboUsuario_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles cboUsuario.SelectionChangeCommitted
            lP_MostrarFoto("Select FOTO From TABLA_GABRIEL Where ID=" & CStr(Me.cboUsuario.SelectedValue))
        End Sub
        Private Sub lP_MostrarFoto(ByVal vsQuery As String)
            Try
                Dim loResultado As Object
                ' crear sentencia, conexión y comando para obtener la imagen de la base de datos
                Using loConexion As New SqlConnection(msCadConexion)
                    ' crear comando
                    Using loComando As New SqlCommand(vsQuery, loConexion)
                        loConexion.Open()
                        loResultado = loComando.ExecuteScalar()
                        If IsDBNull(loResultado) = True Then
                            Me.picFoto.Image = Nothing
                        Else
                            Dim aBytImagen As Byte() = CType(loResultado, Byte())
                            Me.picFoto.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)
                Return
            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

        Private Function lF_ImagenToByteArray(ByVal Imagen As System.Drawing.Image) As Byte()
            ' crear un objeto array de bytes en memoria conteniendo los datos de la imagen
            Dim oMemoryStream As New MemoryStream()
            Imagen.Save(oMemoryStream, System.Drawing.Imaging.ImageFormat.Jpeg)
            Return oMemoryStream.ToArray()
        End Function
    End Class

    Imagen del ejemplo

    P.D.
    No hace falta revisar algo tan elemental como esto.
    Prueba en un proyecto nuevo este ejemplo y una vez que comprendas como funciona, lo adaptas al tuyo real.

    Un saludo desde Bilbo
    Carlos

    • Editado J. Carlos Herrero jueves, 16 de junio de 2016 19:29
    • Marcado como respuesta Renzo19 viernes, 17 de junio de 2016 6:06
    jueves, 16 de junio de 2016 19:25
  • Amigo ahora si, esto es lo que quería; aunque borre algún registro y el id no sea continuo, muestra la foto correspondiente a cada usuario. sin embargo, al copiar esta linea de codigo:   lP_MostrarFoto("Select Foto From [Tabla de gabriel] Where ID = " & CStr(Me.cbUsuario.SelectedValue)) y pegarla en el evento load me sale error de sintaxis cerca de '=' lo copio en el evento load para que tan pronto cargue el formulario cargue la foto correspondiente al primer usuario. Ya me has ayudado bastante si pudieras ayudarme en esa ultima cosa te lo agradecería un mundo.

    Gracias!


    • Editado Renzo19 viernes, 17 de junio de 2016 5:35
    viernes, 17 de junio de 2016 5:35
  • Hola:
    En el Load tienes la siguiente instruccion
    Me.cboUsuario.SelectedIndex = -1
    Esto lo que hace es que el combobox inicialmente NO tenga ningun item seleccionado
    Si quieres que se seleccione alguno en particular, cambia el -1 por otro numero y despues inserta una linea con la siguiente instruccion
    lP_MostrarFoto("Select FOTO From TABLA_GABRIEL Where ID=" & CStr(Me.cboUsuario.SelectedValue))

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Renzo19 viernes, 17 de junio de 2016 6:06
    viernes, 17 de junio de 2016 5:45
  • Ahora si! Gracias amigo, estoy muy agradecido! 
    viernes, 17 de junio de 2016 6:06