none
como puedo obtener el valor de un varbinary de sql server en visual basic? RRS feed

  • Pregunta

  • Tengo una consulta y es la siguiente:

       Como puedo obtener el valor de varbinary de mi procedimiento almacenado a mi objeto en vb.net.

    Mi objeto SolicitudDevModel

    Public Class SolicitudDevModel
    
        Private Data As Byte()
        Public Property _Data() As Byte()
            Get
                Return Data
            End Get
            Set(ByVal value As Byte())
                Data = value
            End Set
        End Property
    
    
    End Class
    

    Mi procedimiento Almacenado

    Public Function rptDevolucionVacios(ByVal numSolicitud As Integer, ByVal usuario As String) As List(Of SolicitudDevModel)
            Dim listaDev As New List(Of SolicitudDevModel)
    
            Try
                Dim cn As SqlConnection = New SqlConnection(cadenadeConexion)
                Dim cmd As SqlCommand = New SqlCommand("spListadoVaDocumentosSolDevElecCodigo", cn)
                'cmd.Connection = cn'
                cn.Open()
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Parameters.AddWithValue("@NumSolVacElec", numSolicitud)
                cmd.Parameters.AddWithValue("@usuario", usuario)
    
                Using dr As SqlDataReader = cmd.ExecuteReader()
                    If dr.HasRows Then
                        While dr.Read()
                            Dim objDev As New SolicitudDevModel With {
    
                                ._Data = dr.GetBytes(0) 'Error al obtener el campo de tipo varbinary(max) sql server'
    
                            }
                            listaDev.Add(objDev)
                        End While
                    End If
                End Using
                cn.Close()
    
    
            Catch ex As Exception
                Throw
            End Try
    
            Return listaDev
        End Function

    Me sale el siguiente error al obtener el campo _Data

    error de resolucion de sobrecarga porque ninguna de las funciones getBytes a las que se tiene acceso acepta este numero de argumentos

    jueves, 8 de octubre de 2020 0:37

Todas las respuestas

  • ese error te sale porque a la funcion GetBytes() le faltan parametros  la clase sqldatareader tiene dos funciones una se llama GetByte() que acepta un parametro index y la otra GetBytes() que requiere de varios parametros a esta ultima le estas pasando un solo parametro por eso el error la sintaxis de esta ultima es como te muestro a continueaccion

    Public Overrides Function GetBytes(i As Integer, dataIndex As Long, buffer() As Byte, bufferIndex As Integer, length As Integer) As Long

    Parámetros:
    i: Índice de columna de base cero
    dataIndex: Índice del campo desde el que se va a comenzar la operación de lectura
    buffer: Búfer en el que se lee la secuencia de bytes
    bufferIndex: Índice del buffer donde va a comenzar la operación de escritura
    length: Longitud máxima que se puede copiar en el búfer

    tienes que crear una array de tipo bytes  y pasarla como parametro a la funcion en el parametro buffer y despues se la asignas a tu funcion _Data = la variable de tipo bytes que creaste




    • Editado DANTE-3D jueves, 8 de octubre de 2020 1:10
    jueves, 8 de octubre de 2020 1:02
  • Te agradecería poder darme un ejemplo o cual usar GetByte o GetBytes.
    jueves, 8 de octubre de 2020 2:04
  • prueva de este modo
        Public Function rptDevolucionVacios(ByVal numSolicitud As Integer, ByVal usuario As String) As List(Of SolicitudDevModel)
            Dim listaDev As New List(Of SolicitudDevModel)
    
            Try
                Dim cn As SqlConnection = New SqlConnection(cadenadeConexion)
                Dim cmd As SqlCommand = New SqlCommand("spListadoVaDocumentosSolDevElecCodigo", cn)
                'cmd.Connection = cn'
                cn.Open()
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Parameters.AddWithValue("@NumSolVacElec", numSolicitud)
                cmd.Parameters.AddWithValue("@usuario", usuario)
    
                Using dr As SqlDataReader = cmd.ExecuteReader()
                    If dr.HasRows Then
                        While dr.Read()
                            Dim buffers(dr.GetStream(0).Length - 1) As Byte
                            dr.GetBytes(0, 0, buffers, 0, buffers.Length)
                            Dim objDev As New SolicitudDevModel With {._Data = buffers}
    
    
                            listaDev.Add(objDev)
                        End While
                    End If
                End Using
                cn.Close()
    
    
            Catch ex As Exception
                Throw
            End Try
    
            Return listaDev
        End Function

    jueves, 8 de octubre de 2020 2:26
  • Hola Joaquin MB,

    Una tabla hash puede mantener el valor varbinary. Luego se puede utilizar según sea necesario:

     Dim table As New Hashtable
     Dim ds As DataSet
     Dim count As Integer = 0
    
     'ds ahora contiene la tabla con la columna varbinary'
     ds = getSqlTable()
    
     For Each row In ds.Tables(0).Rows
       table(count) = row("varBinaryColumn")
       count += 1
     Next

    Se puede cargar de nuevo a SQL mediante este código:

     For Each item In table
        Dim sqlCmd As New SqlCommand
        sqlCmd.Parameters.Add("@binaryValue", SqlDbType.VarBinary, 8000).Value = item.Value
     Next

    Un cast directo sería así:

    bytes = TryCast(dt.Rows(0)("FileData"), System.Data.Linq.Binary).ToArray()

    Acá puedes leer otra opción (mira la versión en inglés ya que el código también se tradujo). Espero que te sea de ayuda. Por favor no olvides marcar una respuesta si resolviste tu consulta (debajo de cada post hay una opción que dice “Marcar como Respuesta”). Quedo pendiente de cualquier actualización. Gracias por levantar tu consulta en los foros de msdn.

     

    Saludos cordiales

    Gabriel Castro

     ____________________________ 

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    jueves, 8 de octubre de 2020 4:36
    Moderador
  • Hola Joaquin MB,

    ¿Alguna novedad sobre tu pregunta? ¿Han sido útiles las respuestas proporcionadas? Por favor no olvides marcar una respuesta si resolviste tu consulta (debajo de cada post hay una opción que dice "Marcar como respuesta").

     

    Saludos cordiales

    Gabriel Castro

     ____________________________ 

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    sábado, 17 de octubre de 2020 1:03
    Moderador