Usuario
como puedo obtener el valor de un varbinary de sql server en visual basic?

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
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úfertienes 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
-
-
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
-
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.
- Editado Gabriel Castro RModerator jueves, 8 de octubre de 2020 4:37
-
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.