none
VB.NET - Como declarar una variable del tipo binary(max) como vacia

    Pregunta

  • Hola a todos.

    Necessito vaciar el contenido de una variable después de utilizala.
    ¿Como lo hago ?

    1 - Capa Entidad

    Public Class CEChamadoHomologado
        Private _docRequisito_Binario As Byte()
    
        Public Property docRequisito_Binario As Byte()
            Get
                Return _docRequisito_Binario
            End Get
            Set(value As Byte())
                _docRequisito_Binario = value
            End Set
        End Property
    	

    2 - Capa Presentacion

        ....	
    	Dim doc_ReqBinario As Byte()	
        ....
    
        Public Function GetPathDocReq()	
    	 doc_ReqBinario = GetFiletoBytes(PathFile)
        Return doc_ReqBinario
    	
        Sub IncluirArquivo()
                Dim objeto As New CEChamadoHomologado
                objeto.docRequisito_Binario = doc_ReqBinario '-- Necesito vaciar esta variável que há
    sido declarada en la linea primera.
    capaNegocios.novoArquivo(objeto End Sub ...

    Gracias por ayudarme.


    JoseBonfim (desde Brazil)


    • Editado JoseBonfim sábado, 24 de diciembre de 2016 20:58
    sábado, 24 de diciembre de 2016 20:58

Respuestas

  • "JoseBonfim" preguntó:

    > Necessito vaciar el contenido de una variable después de utilizala.
    > ¿Como lo hago ?
    >
    > 2 - Capa Presentacion
    >    .... 
    >    Dim doc_ReqBinario As Byte()
    >
    >    objeto.docRequisito_Binario = doc_ReqBinario '-- Necesito vaciar esta variável que há
                                                          sido declarada en la linea primera.
    Hola:

    Para "vaciar" el contenido de cualquier variable o campo declarado como una matriz de cualquier tipo de dato, lo harías igual que "limpiarías" el valor de cualquier otra variable objeto, es decir, estableciendo su valor a Nothing:

        ' Asignamos el valor de la variable
        objeto.docRequisito_Binario = doc_ReqBinario
    
        ' Limpiamos su valor
        doc_ReqBinario = Nothing

    O ya que estás utilizando Visual Basic, también podrías utilizar la instrucción Erase para liberar la memoria utilizada por una o más matrices:

        ' Liberamos una matriz
        Erase doc_ReqBinario
    
        ' Liberamos cuatro matrices de diferentes tipos de datos
        Erase doc_RegBinario, otraMatrizDouble, otraMatrizInteger, otraMatrizDecimal

    Con esto, creo que tu pregunta está respondida. Ahora, pasemos a lo siguiente.

    >    Dim doc_ReqBinario As Byte() 
    >  
    >    Public Function GetPathDocReq() 
    >        doc_ReqBinario = GetFiletoBytes(PathFile)
    >        Return doc_ReqBinario

    Deberías de saber que todo procedimiento Function debería de devolver explícitamente un valor concreto, y no el valor que tenga un campo privado declarado a nivel de clase o módulo, porque lo único que puede pasar es que se modifique sin querer el valor de dicho campo, por lo que la función puede devolver resultados inesperados.

    Te funciona esa declaración porque con toda seguridad tendrás desactivada la instrucción Option Strict, cosa que NO SE RECOMIENDA EN ABSOLUTO. Lee la "coletilla" que aparece al final de todos mis mensajes.

    Si tienes una función que devuelve una matriz de bytes, lo correcto es que la implementes como indico a continuación:

        Public Function GetPathDocReq() As Byte()
            ' Devolver el valor obtenido del método GetFiletoBytes
            Return GetFiletoBytes(PathFile)
        End Function

    Se comprende que la función llamada GetFiletoBytes() también devuelve otra matriz de bytes.

    Y ahora, llamarías a la función GetPathDocReq() de la siguiente manera:

        Sub IncluirArquivo()
    
            Dim objeto As New CEChamadoHomologado
            
            ' Obtenemos la matriz de bytes devuelta por la función GetPathDocReq
            objeto.docRequisito_Binario = GetPathDocReq()
            
            capaNegocios.novoArquivo(objeto.docRequisito_Binario)
    
       End Sub

    Con lo cual ya no te haría falta tener declarado un campo (o variable) llamada doc_ReqBinario, y por ende, no tendrías que preocuparte de "vaciar" su valor. ;-)

    Un saludo y ¡Feliz Navidad!


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    domingo, 25 de diciembre de 2016 7:50
    Moderador
  • "JoseBonfim" preguntó:

    > Hago una consulta al BD que me devuelve se hay datos inclusos.
    > En la primer inclusión al DB puedo:
    >
    > Enviar un dato o los dos.
    > ¿Como hago para enviar uno de los datos con el valor equal a NULL  ?
    > En el DB lo hago así: UPDATE docrequisito_binario = NULL

    Para guardar un valor NULL en la tabla de cualquier base de datos, tienes que enviar el valor del campo DBNull.Value.

    Vamos a suponer que deseas enviar a la tabla el valor que tenga actualmente una variable declarada como una matriz de bytes:

        Dim docrequisito_binario As Byte()

    Y que la consulta UPDATE con parámetros que deseas ejecutar es la siguiente:

        objetoCommand.CommandText = "UPDATE NombreTable SET docrequisito_binario = @param1"

    A la hora de añadir el parámetro "@param1" a la colección Parameters del objeto llamado objetoCommand (que se comprende es del tipo SqlCommand, OleDbCommand, o de cualquier otro derivado de la clase DbCommand), lo harías de la siguiente manera:

       
    objetoCommand.Parameters.AddWithValue("@param1", _
    If(docrequisito_binario Is Nothing, CObj(DBNull.Value), docrequisito_binario)
    )

    Es decir, si el valor de la variable docrequisito_binario es Nothing, enviaremos el valor DBNull.Value (un valor NULL); en caso contrario, enviaremos el valor que actualmente tenga la variable docrequisito_binario.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    domingo, 25 de diciembre de 2016 15:28
    Moderador
  • "JoseBonfim" escribió:

    > No logre exito al arreglar el código:
    >
    > Mira el error en la imagene:

    La imagen NO MUESTRA ERROR alguno. Si te fijas bien, el contenido de la imagen te está ADVIRTIENDO que el método Add del objeto SqlConnection ESTÁ OBSOLETO, y que deberías utilizar el método AddWithValue, tal y como te indiqué en mi respuesta anterior.

    Si te limitas a ejecutar

    >   .Add("@DOCREQUISITO_BINARIO", SqlDbType.VarBinary).Value = objArq.docRequisito_Binario

    Tú le estás pasando el valor que tiene ACTUALMENTE el campo 'objArq.docRequisito_Binario'. Pero si ese valor es Nothing, deberías de saber que es un valor diferente a NULL, que es el valor que dices que deseas insertar en el campo de la tabla.

    Tienes que hacerlo como te indique anteriormente, utilizando el operador If:

        .Add("@DOCREQUISITO_BINARIO", SqlDbType.VarBinary).Value = _
           If(objArq.docrequisito_Binario Is Nothing, CObj(DBNull.Value), objArq.docRequisito_Binario)

    O mejor, utilizando el método AddWithValue:

        .AddWithValue("@DOCREQUISITO_BINARIO", _
           If(objArq.docrequisito_Binario Is Nothing, CObj(DBNull.Value), objArq.docRequisito_Binario))


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    martes, 27 de diciembre de 2016 7:27
    Moderador

Todas las respuestas

  • "JoseBonfim" preguntó:

    > Necessito vaciar el contenido de una variable después de utilizala.
    > ¿Como lo hago ?
    >
    > 2 - Capa Presentacion
    >    .... 
    >    Dim doc_ReqBinario As Byte()
    >
    >    objeto.docRequisito_Binario = doc_ReqBinario '-- Necesito vaciar esta variável que há
                                                          sido declarada en la linea primera.
    Hola:

    Para "vaciar" el contenido de cualquier variable o campo declarado como una matriz de cualquier tipo de dato, lo harías igual que "limpiarías" el valor de cualquier otra variable objeto, es decir, estableciendo su valor a Nothing:

        ' Asignamos el valor de la variable
        objeto.docRequisito_Binario = doc_ReqBinario
    
        ' Limpiamos su valor
        doc_ReqBinario = Nothing

    O ya que estás utilizando Visual Basic, también podrías utilizar la instrucción Erase para liberar la memoria utilizada por una o más matrices:

        ' Liberamos una matriz
        Erase doc_ReqBinario
    
        ' Liberamos cuatro matrices de diferentes tipos de datos
        Erase doc_RegBinario, otraMatrizDouble, otraMatrizInteger, otraMatrizDecimal

    Con esto, creo que tu pregunta está respondida. Ahora, pasemos a lo siguiente.

    >    Dim doc_ReqBinario As Byte() 
    >  
    >    Public Function GetPathDocReq() 
    >        doc_ReqBinario = GetFiletoBytes(PathFile)
    >        Return doc_ReqBinario

    Deberías de saber que todo procedimiento Function debería de devolver explícitamente un valor concreto, y no el valor que tenga un campo privado declarado a nivel de clase o módulo, porque lo único que puede pasar es que se modifique sin querer el valor de dicho campo, por lo que la función puede devolver resultados inesperados.

    Te funciona esa declaración porque con toda seguridad tendrás desactivada la instrucción Option Strict, cosa que NO SE RECOMIENDA EN ABSOLUTO. Lee la "coletilla" que aparece al final de todos mis mensajes.

    Si tienes una función que devuelve una matriz de bytes, lo correcto es que la implementes como indico a continuación:

        Public Function GetPathDocReq() As Byte()
            ' Devolver el valor obtenido del método GetFiletoBytes
            Return GetFiletoBytes(PathFile)
        End Function

    Se comprende que la función llamada GetFiletoBytes() también devuelve otra matriz de bytes.

    Y ahora, llamarías a la función GetPathDocReq() de la siguiente manera:

        Sub IncluirArquivo()
    
            Dim objeto As New CEChamadoHomologado
            
            ' Obtenemos la matriz de bytes devuelta por la función GetPathDocReq
            objeto.docRequisito_Binario = GetPathDocReq()
            
            capaNegocios.novoArquivo(objeto.docRequisito_Binario)
    
       End Sub

    Con lo cual ya no te haría falta tener declarado un campo (o variable) llamada doc_ReqBinario, y por ende, no tendrías que preocuparte de "vaciar" su valor. ;-)

    Un saludo y ¡Feliz Navidad!


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    domingo, 25 de diciembre de 2016 7:50
    Moderador
  • Enrique,

    Gracias por contestarme.
    He usado el valor equal a Nothing e logre êxito.

    Pero tengo otra necesidad.

    Mi form tiene 2 opciones
    1 - docrequisito_binario
    2 - dochomolog_binario

    Entonces
    Hago una consulta al BD que me devuelve se hay datos inclusos.
    En la primer inclusión al DB puedo:

    Enviar un dato o los dos.
    ¿Como hago para enviar uno de los datos con el valor equal a NULL  ?
    En el DB lo hago así: UPDATE docrequisito_binario = NULL

    Tendré 2 procedures
    1 - Graba 1 uno de los datos com el valor = NULL
    2 - Actualizar los datos cuando un de ellos ya estan grabados.

    Feliz Navidad para Tí e todos los tuyos.


    JoseBonfim

    domingo, 25 de diciembre de 2016 13:53
  • "JoseBonfim" preguntó:

    > Hago una consulta al BD que me devuelve se hay datos inclusos.
    > En la primer inclusión al DB puedo:
    >
    > Enviar un dato o los dos.
    > ¿Como hago para enviar uno de los datos con el valor equal a NULL  ?
    > En el DB lo hago así: UPDATE docrequisito_binario = NULL

    Para guardar un valor NULL en la tabla de cualquier base de datos, tienes que enviar el valor del campo DBNull.Value.

    Vamos a suponer que deseas enviar a la tabla el valor que tenga actualmente una variable declarada como una matriz de bytes:

        Dim docrequisito_binario As Byte()

    Y que la consulta UPDATE con parámetros que deseas ejecutar es la siguiente:

        objetoCommand.CommandText = "UPDATE NombreTable SET docrequisito_binario = @param1"

    A la hora de añadir el parámetro "@param1" a la colección Parameters del objeto llamado objetoCommand (que se comprende es del tipo SqlCommand, OleDbCommand, o de cualquier otro derivado de la clase DbCommand), lo harías de la siguiente manera:

       
    objetoCommand.Parameters.AddWithValue("@param1", _
    If(docrequisito_binario Is Nothing, CObj(DBNull.Value), docrequisito_binario)
    )

    Es decir, si el valor de la variable docrequisito_binario es Nothing, enviaremos el valor DBNull.Value (un valor NULL); en caso contrario, enviaremos el valor que actualmente tenga la variable docrequisito_binario.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    domingo, 25 de diciembre de 2016 15:28
    Moderador
  • Enrique,

    No logre exito al arreglar el código:
    1 - Capa Datos

        Public Sub novoArquivo(ByVal objArq As CEChamadoHomologado)
            cn = objCon.conectar()
            Try
    
                cn.Open()
                da = New SqlDataAdapter("PROC_vbi_CADASTRA_CHAMADO_HOMOLOGADO", cn)
                da.SelectCommand.CommandType = CommandType.StoredProcedure
                With da.SelectCommand.Parameters
                    .Add("@CODIGO_FORNECEDOR", SqlDbType.Char).Value = objArq.codigo_Fornecedor
                    .Add("@CODIGO_CHAMADO", SqlDbType.Char).Value = objArq.codigo_Chamado
    
                    '.Add("@param1", If(docrequisito_binario Is Nothing, CObj(DBNull.Value), docrequisito_binario))
    
                    .Add("@DOCREQUISITO_BINARIO", SqlDbType.VarBinary).Value = objArq.docRequisito_Binario
                    .Add("@NOME_DOCREQUISITO", SqlDbType.Char).Value = objArq.nome_DocRequisito
                    .Add("@DOCHOMOLOGADO_BINARIO", SqlDbType.VarBinary).Value = objArq.docHomologado_Binario
                    .Add("@NOME_DOCHOMOLOGADO", SqlDbType.Char).Value = objArq.nome_DocHmologado
                    .Add("@DOCR", SqlDbType.Char).Value = "0" ' -objArq.docRH
                    .Add("@DOCH", SqlDbType.Char).Value = "1" ' -objArq.docRH
                    .Add("@DATA_HOMOLOGACAO", SqlDbType.Char).Value = objArq.data_Homologacao
                End With
                da.SelectCommand.ExecuteNonQuery()
            Catch ex As Exception
                MessageBox.Show("Error ao incluir Aquivo " + ex.Message, "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Finally
                da.Dispose()
                cn.Dispose()
            End Try
        End Sub

    Mira el error en la imagene:
    

    Gracias, por ayudarme.


    JoseBonfim

    lunes, 26 de diciembre de 2016 23:17
  • "JoseBonfim" escribió:

    > No logre exito al arreglar el código:
    >
    > Mira el error en la imagene:

    La imagen NO MUESTRA ERROR alguno. Si te fijas bien, el contenido de la imagen te está ADVIRTIENDO que el método Add del objeto SqlConnection ESTÁ OBSOLETO, y que deberías utilizar el método AddWithValue, tal y como te indiqué en mi respuesta anterior.

    Si te limitas a ejecutar

    >   .Add("@DOCREQUISITO_BINARIO", SqlDbType.VarBinary).Value = objArq.docRequisito_Binario

    Tú le estás pasando el valor que tiene ACTUALMENTE el campo 'objArq.docRequisito_Binario'. Pero si ese valor es Nothing, deberías de saber que es un valor diferente a NULL, que es el valor que dices que deseas insertar en el campo de la tabla.

    Tienes que hacerlo como te indique anteriormente, utilizando el operador If:

        .Add("@DOCREQUISITO_BINARIO", SqlDbType.VarBinary).Value = _
           If(objArq.docrequisito_Binario Is Nothing, CObj(DBNull.Value), objArq.docRequisito_Binario)

    O mejor, utilizando el método AddWithValue:

        .AddWithValue("@DOCREQUISITO_BINARIO", _
           If(objArq.docrequisito_Binario Is Nothing, CObj(DBNull.Value), objArq.docRequisito_Binario))


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    martes, 27 de diciembre de 2016 7:27
    Moderador