none
Cargar Imagen desde Sql Server RRS feed

  • Pregunta

  • Buenas amigos, Ya me cansé de probar y buscar y nada...

    Estoy intentando recuperar una imagen de BD Sql server 2005, tengo vb 2008, la tabla se llama tblImagen y el campo imgImagen es de tipo varBinary(max). El metodo Guardar funciona Ok.

    He probado el código de elguille primeramente y me sale el error: El parámetro no es válido

    He visto que en el foro habian solucionado algo, pero no me queda claro.

    En el codigo que coloco hay otra prueba que hice (está en comentarios en el metodo Obtener) y me sale el mismo error.

     Public Function Guardar() As Integer
        Dim resultado As Integer
        Dim objDat As New clsDatos()
        Dim args(5) As System.Object
        Try
          args(0) = 1
          args(1) = 2
          args(2) = 3
          args(3) = Image2Bytes(imgImagen)
          args(4) = resultado
    
          resultado = objDat.Ejecutar("sp_InsertarDatosConImagen", args)
          Return resultado
        Catch ex As Exception
          Windows.Forms.MessageBox.Show("Error al Guardar.", "Advertencia", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
        End Try
      End Function
    
    
    Public Overloads Sub Obtener(ByVal intIdII As Integer, ByVal pic1 As PictureBox, ByVal pic2 As PictureBox, ByVal pic3 As PictureBox, ByVal pic4 As PictureBox, ByVal pic5 As PictureBox, ByVal pic6 As PictureBox)
        Try
          Dim objDat As New clsDatos()
          Dim dr As SqlClient.SqlDataReader
    
          Dim args(2) As System.Object
          args(0) = " imgImagen "
          args(1) = "tblImagen"
          args(2) = "intIdInspecIni =" & intIdII
          dr = objDat.EjecutarDataReader("sp_SelectFiltroTabla", args)
    
          'Este segmento de código tambien lo probé y me sale el mismo error.
          ' '' '' ''dr.Read()
          ' '' '' ''Dim oMemoryStream As System.IO.MemoryStream
          ' '' '' ''Dim bmpImagen As System.Drawing.Bitmap
          ' '' '' ''Dim maBytImagen() As Byte = CType(dr("imgImagen"), Byte())
          ' '' '' ''oMemoryStream = New System.IO.MemoryStream(maBytImagen, True)
          ' '' '' ''bmpImagen = New System.Drawing.Bitmap(oMemoryStream) 'Aca da error.
          ' '' '' ''pic1.Image = bmpImagen
          'fin de otra prueba.
    
          If dr.HasRows = True Then
            dr.Read()
            pic1.Image = Bytes2Image(CType(dr.Item("imgImagen"), Byte()))
          Else
            pic1.Image = Nothing
          End If
        Catch ex As Exception
          MsgBox(ex.Message)
        End Try
      End Sub
    
    
      Private Function Image2Bytes(ByVal img As System.Drawing.Image) As Byte()
    
        Dim sTemp As String = IO.Path.GetTempFileName
        Dim fs As New IO.FileStream(sTemp, IO.FileMode.OpenOrCreate, IO.FileAccess.ReadWrite)
        img.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg)
    
        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
    
      Private Function Bytes2Image(ByVal bytes() As Byte) As System.Drawing.Image
        If bytes Is Nothing Then
          Return Nothing
    
        End If
        Dim ms As New IO.MemoryStream(bytes)
        Dim bm As System.Drawing.Bitmap = Nothing
    
        Try
          bm = New System.Drawing.Bitmap(ms) 'Aca me sale el error.
        Catch ex As Exception
          Windows.Forms.MessageBox.Show(ex.Message)
        End Try
        Return bm
      End Function
    

     

    • Cambiado Enrique M. Montejo jueves, 18 de agosto de 2011 17:31 acceso a datos (De:Lenguaje VB.NET)
    lunes, 8 de agosto de 2011 23:29

Todas las respuestas

  • hola

    te has olvidado de poner el codigod el metodo Image2Bytes() porque creo que el problema esta en como defines este parametros en la query

    valida este articulo

    [WinForms] Edición Empleados – Grabar imagen en base de datos

    vas a ver alli que para persistir la imagen se usa

    Dim imageParam As SqlParameter = cmd.Parameters.Add("@Imagen", SqlDbType.VarBinary)
    imageParam.Value = empleado.Imagen

     

    o sea debes definir el tipo correcto, quizas si usas AddWithValue() no este tomando el tipo correcto

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 9 de agosto de 2011 6:36
  • Gracias Leandro por tu respuesta.

    El método Image2Bytes() está colocado...de todas maneras revisaré el link q pasaste.

    Gracias nuevamente.

    martes, 9 de agosto de 2011 13:23
  • ups me quivoque de metodo me referia a este EjecutarDataReader()

    alli es dodne armarias el parametro basado en el array, pero debes indicar el tipo para que funcione, la cuestion es que en el array no has pensado indicar el tipo ? se puede complicar

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 9 de agosto de 2011 13:26
  • Hola Bernardo!

     

    Yo lo hago asi:

     

      Public Sub AsignarValor(ByVal valor As Byte())
        If valor Is Nothing Then
          Me.PictureBox.Image = Nothing
        Else
          Dim ms As New MemoryStream(valor)
          Me.PictureBox.Image = Image.FromStream(ms)
        End If
      End Sub
    
    
    y a la función la llamo así:
    
      AsignarValor(dr.Item("imgImagen"))
    

    Saludos!

    martes, 9 de agosto de 2011 14:15
  • Hola Leandro, aun no logro solucionar el problema me sigue saliendo PARAMETRO NO VALIDO. Estaba revisando al momento de guardar, el array de la imagen se coloca lleno de ceros en todas sus casillas, es correcto esto?

    Ahora he cambiado mi codigo de la siguiente forma, especificando el tipo de datos como mencionaste arriba:

     <strong>'Este es el metodo Guardar.
    </strong>'La variable imgImagen es un picture.image
    'La funcion Image2Bytes esta en el post del inicio.
    
     Public Function Guardar() As Integer
        Dim resultado As Integer
        Dim objDat As New clsDatos()
        Try
          resultado = objDat.InsertarDatosConImagenOMPLA("sp_InsertarDatosConImagen", Image2Bytes(imgImagen), 4, 1)
          Return resultado
        Catch ex As Exception
          Windows.Forms.MessageBox.Show("Error al Guardar.", "Advertencia", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error)
        End Try
    
    
    
    <strong>'La funcion donde se llama al proc. almacenado
    
    </strong>  Public Function InsertarDatosConImagenOMPLA(ByVal strProcAlmac As String, ByVal b As Byte(), ByVal intIdInsp As Integer, ByVal tipo As Integer) As Integer
        Dim cmd As New SqlCommand()
        Dim i As Integer
    
        cmd.Connection = New SqlConnection(CadenaConexion)
        cmd.Connection.Open()
        cmd.CommandText = "sp_InsertarDatosConImagen"
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.Add("@imgImagen", SqlDbType.VarBinary).Value = b 'Aca va la imagen en bytes
        cmd.Parameters.Add("@intIdInspec", SqlDbType.Int).Value = intIdInsp
        cmd.Parameters.Add("@intTipo", SqlDbType.Int).Value = tipo
        cmd.Parameters.Add("@resultado", SqlDbType.Int).Value = 2
    
        i = cmd.ExecuteNonQuery()
    
        cmd.Connection.Close()
        cmd.Dispose()
        Return i
      End Function
    
    
    <strong>'Este es mi Proc. Almacenado para insertar a la bd
    </strong>[sp_InsertarDatosConImagen]
    	@imgImagen varbinary(MAX), 
    	@intIdInspec integer,
    	@intTipo integer,
    	 @resultado integer output
    AS
    	SET NOCOUNT ON 
    	if (@intTipo=1) --Si es 1 inserta a la InspeccionInicial
    	begin
    	    INSERT INTO tblImagen(intIdInspecIni,imgImagen)
    		values( @intIdInspec,@imgImagen);  
    	end
    	
      if(@@error=0)
       begin
         set @resultado=1
         Return (1)
       End
       Else
        begin
          set @resultado=0
          Return (0)
        End 
    
    <strong>' Este es el metodo que utilizo para Obtener mi imagen.
    
    </strong>Public Overloads Sub Obtener(ByVal intIdII As Integer, ByVal pic1 As PictureBox, ByVal pic2 As PictureBox, ByVal pic3 As PictureBox, ByVal pic4 As PictureBox, ByVal pic5 As PictureBox, ByVal pic6 As PictureBox)
        Try
          Dim objDat As New clsDatos()
          Dim dr As SqlClient.SqlDataReader
          dr = objDat.EjecutarDataReaderOMPLA("sp_SelectImagen")
    
          If dr.HasRows = True Then
            dr.Read()
            If dr.Item("imgImagen") IsNot DBNull.Value Then
              pic1.Image = Bytes2Image(CType(dr.Item("imgImagen"), Byte()))  'Aca me sigue saliendo el error.
            End If
          Else
            pic1.Image = Nothing
          End If
        Catch ex As Exception
          MsgBox(ex.Message)
        End Try
      End Sub
    
    Public Function EjecutarDataReaderOMPLA(ByVal NombreProcedimiento As String) As SqlClient.SqlDataReader
        Dim cmd As New SqlCommand()
        cmd.Connection = New SqlConnection(CadenaConexion)
        cmd.Connection.Open()
        cmd.CommandText = "sp_SelectImagen"
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.Add("@intIdInspec", SqlDbType.Int).Value = 4
        cmd.Parameters.Add("@intTipo", SqlDbType.Int).Value = 1
        Return cmd.ExecuteReader
    
        cmd.Connection.Close()
        cmd.Dispose()
    
      End Function
    
    
    <strong>'Este es el procedimiento almacenado para obtener la imagen.
    </strong>[sp_SelectImagen]
    	(@intIdInspec integer,
    	@intTipo integer)
    	AS
    	if(@intTipo=1)
    	begin
    		select imgImagen,intIdInspecIni from tblImagen where intIdInspecIni = @intIdInspec
    	end
    


    PD. JavierRomero, tambien coloque tu codigo y no me funciono , me sale el mismo error.

    GRACIAS POR CUALQUIER AYUDA. 

    martes, 9 de agosto de 2011 22:20