none
Como operar con un campo bit? RRS feed

  • Pregunta

  • Hola Comunidad ,buen dia.Tengo una duda ,que debe ser sencilla la respuesta pero como no encontre algo en google que explique sobre los datos bit ya que nunca use este tipo de datos, queria preguntar como se manipula un dato de este tipo del lado de vb .Tengo un campo bit en una tabla en sql server y tengo que hacer un insert a la misma pero nose como pasarlo al parametro de ese campo y como estoy haciendo un alta le paso siempre true,por ej. y despues en otro form tengo que modificarlo a ese valor en algunos registros tendra false.Cuando uno levanta este dato de la tabla,hay que crear una variable booleana en vb para usarla? Como seria 1 es true y 0 es false?

    Les agradezco de antemano si me pueden aclarar un poco el tema.

    Muchas Gracias.

    sábado, 11 de enero de 2014 19:53

Respuestas

  • "Albert Vega" preguntó:

    > queria preguntar como se manipula un dato de este tipo del lado de vb.

    El tipo de dato bit de SQL Server, o de cualquier otro motor de base de datos, equivaldría al tipo System.Boolean del marco de trabajo .NET o al tipo  Boolean de Visual Basic .net:

    Asignar tipos de datos de SQL Server

    Configurar parámetros y tipos de datos de parámetros (ADO.NET)


    > Tengo un campo bit en una tabla en sql server ... Cuando uno levanta
    > este dato de la tabla,hay que crear una variable booleana en vb para
    > usarla? Como seria 1 es true y 0 es false?

    Tal y como se indica en la ayuda de MSDN, hay que tener en cuenta la siguiente regla, por así decirlo. Cuando Visual Basic convierte los valores de tipos de datos numéricos en Boolean, 0 pasa a ser False y todos los otros valores serán True.  Cuando Visual Basic convierte los valores Boolean en tipos numéricos, False pasa a ser 0 y True en -1.

    Por tanto, cuando desees "levantar" un dato bit de una tabla de SQL Server, tienes que declarar una variable Boolean, o asignarle directamente el valor a una propiedad Boolean de cualquier control (por ejemplo, a la propiedad Checked de un control CheckBox).

    Siguiendo la regla anterior, si el valor del campo bit es 0 (numérico) se transformará automáticamente en False, y en True si el valor es 1. En el supuesto de que quisiéramos convertir a Boolean el valor de cualquier tipo de dato numérico distinto del tipo de dato bit de SQL Server, todo valor distinto de cero se convertiría en True.

    Vamos a insertar el valor de la propiedad Checked (un valor Boolean) en un supuesto campo bit de una tabla de SQL Server:

     
           Using cnn As New SqlConnection(cadenaConexion)
                
                Dim cmd As SqlCommand = cnn.CreateCommand()
                cmd.CommandText = "INSERT INTO Tabla1(Campo2) VALUES(@valor)"
    
                cmd.Parameters.AddWithValue("@valor", If(CheckBox1.Checked, True, False))
    
                cnn.Open()
    
                cmd.ExecuteNonQuery()
    
            End Using

    Igual resultado se produciría si ejecutamos:

        cmd.Parameters.AddWithValue("@valor", If(CheckBox1.Checked, 1, 0))

    Si por casualidad deseas asignarle un valor NULL en lugar de un valor False, tendrías que actuar de la misma manera que te indiqué en otro mensaje anterior:

        cmd.Parameters.AddWithValue("@valor", If(CheckBox1.Checked, 1, CObj(DBNull.Value)))

    Ahora vamos a "levantar" ese valor bit:

            Using cnn As New SqlConnection(cadenaConexion)
    
                Dim cmd As SqlCommand = cnn.CreateCommand()
                cmd.CommandText = "SELECT Campo2 FROM Tabla1 WHERE Campo1 = @Id"
                cmd.Parameters.AddWithValue("@Id", TextBox1.Text)
    
                cnn.Open()
    
                Dim value As Object = cmd.ExecuteScalar()
    
                If (value Is DBNull.Value) Then
                    value = Nothing
                End If
    
                CheckBox1.Checked = CBool(value)
    
            End Using

    Aquí tienes que tener cuidado con los posibles valores NULL que tenga el campo, ya que un valor System.DBNull no se puede convertir a Boolean, de ahí que verificamos el posible valor NULL para asignarle el valor Nothing, un valor que sí se puede convertir a Boolean como False. Por último, hacemos la conversión a Boolean para asignarle el valor a la propiedad Checked del control CheckBox.


    Enrique Martínez Montejo
            [MS MVP - VB]

    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, 12 de enero de 2014 8:58
    Moderador
  • "Aaron Rincon" preguntó:

    > yo tengo un problema ya solo me falta cargar o levantar el
    > checkbox a la hora de dependiendo que dato tenga si tiene
    > SI o NO solo que mi campo en la base de datos lo tengo
    > como nvarchar

    Te recomendé que ese campo fuera del tipo bit en lugar del tipo nvarchar, si solamente va a tener valores Verdadero (S, SI) o Falso (N, NO).

    Pero si sigues "empeñado" en que sea del tipo nvarchar (alfanumérico), al menos defínelo con el tipo de dato char(1), si solamente va a tener un carácter (S, N), o char(2) si va a tener dos caracteres (SI, NO).

    De todas maneras, sea del tipo nvarchar como del tipo char, lo cargarías de la siguiente manera:

       Dim value As Object = cmd.ExecuteScalar()
    
       If (value Is DBNull.Value) Then
           value = Nothing
       End If
    
       CheckBox1.Checked = If(Convert.ToString(value) = "S", True, False)

    Si el valor del campo tiene dos caracteres (SI, NO), entonces verificarías el valor de ésta manera:

        CheckBox1.Checked = If(Convert.ToString(value) = "SI", True, False)

    El inconveniente que tiene trabajar con tipos de datos nvarchar o char es que se distingue entre mayúsculas y minúsculas, por tanto, SI será diferente a Si, y N también será diferente de n, cuestión esta que no tendrías que preocuparte si el tipo de dato en la tabla de SQL Server fuera del tipo bit.

    En definitiva, tienes que verificar los valores de la misma manera que lo has insertado. Si a la hora de añadir el registro o modificarlo lo has hecho en mayúscula (SI, NO), tienes también que verificar el resultado en mayúscula, o bien, también puedes verificar los datos sin importar que estén en mayúscula o minúscula ejecutando:

        CheckBox1.Checked = If(Convert.ToString(value).ToUpperInvariant() = "SI", True, False)

    Fíjate todo lo que hay que tener en cuenta por tener el "capricho" de definir el tipo de dato como nvarchar o char, en lugar de tenerlo definido como bit, siempre y cuando ese campo actúe como un valor Boolean (S/N, Verdadero/Falso). ;-)


    Enrique Martínez Montejo
            [MS MVP - VB]

    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.



    sábado, 18 de enero de 2014 9:25
    Moderador

Todas las respuestas

  • "Albert Vega" preguntó:

    > queria preguntar como se manipula un dato de este tipo del lado de vb.

    El tipo de dato bit de SQL Server, o de cualquier otro motor de base de datos, equivaldría al tipo System.Boolean del marco de trabajo .NET o al tipo  Boolean de Visual Basic .net:

    Asignar tipos de datos de SQL Server

    Configurar parámetros y tipos de datos de parámetros (ADO.NET)


    > Tengo un campo bit en una tabla en sql server ... Cuando uno levanta
    > este dato de la tabla,hay que crear una variable booleana en vb para
    > usarla? Como seria 1 es true y 0 es false?

    Tal y como se indica en la ayuda de MSDN, hay que tener en cuenta la siguiente regla, por así decirlo. Cuando Visual Basic convierte los valores de tipos de datos numéricos en Boolean, 0 pasa a ser False y todos los otros valores serán True.  Cuando Visual Basic convierte los valores Boolean en tipos numéricos, False pasa a ser 0 y True en -1.

    Por tanto, cuando desees "levantar" un dato bit de una tabla de SQL Server, tienes que declarar una variable Boolean, o asignarle directamente el valor a una propiedad Boolean de cualquier control (por ejemplo, a la propiedad Checked de un control CheckBox).

    Siguiendo la regla anterior, si el valor del campo bit es 0 (numérico) se transformará automáticamente en False, y en True si el valor es 1. En el supuesto de que quisiéramos convertir a Boolean el valor de cualquier tipo de dato numérico distinto del tipo de dato bit de SQL Server, todo valor distinto de cero se convertiría en True.

    Vamos a insertar el valor de la propiedad Checked (un valor Boolean) en un supuesto campo bit de una tabla de SQL Server:

     
           Using cnn As New SqlConnection(cadenaConexion)
                
                Dim cmd As SqlCommand = cnn.CreateCommand()
                cmd.CommandText = "INSERT INTO Tabla1(Campo2) VALUES(@valor)"
    
                cmd.Parameters.AddWithValue("@valor", If(CheckBox1.Checked, True, False))
    
                cnn.Open()
    
                cmd.ExecuteNonQuery()
    
            End Using

    Igual resultado se produciría si ejecutamos:

        cmd.Parameters.AddWithValue("@valor", If(CheckBox1.Checked, 1, 0))

    Si por casualidad deseas asignarle un valor NULL en lugar de un valor False, tendrías que actuar de la misma manera que te indiqué en otro mensaje anterior:

        cmd.Parameters.AddWithValue("@valor", If(CheckBox1.Checked, 1, CObj(DBNull.Value)))

    Ahora vamos a "levantar" ese valor bit:

            Using cnn As New SqlConnection(cadenaConexion)
    
                Dim cmd As SqlCommand = cnn.CreateCommand()
                cmd.CommandText = "SELECT Campo2 FROM Tabla1 WHERE Campo1 = @Id"
                cmd.Parameters.AddWithValue("@Id", TextBox1.Text)
    
                cnn.Open()
    
                Dim value As Object = cmd.ExecuteScalar()
    
                If (value Is DBNull.Value) Then
                    value = Nothing
                End If
    
                CheckBox1.Checked = CBool(value)
    
            End Using

    Aquí tienes que tener cuidado con los posibles valores NULL que tenga el campo, ya que un valor System.DBNull no se puede convertir a Boolean, de ahí que verificamos el posible valor NULL para asignarle el valor Nothing, un valor que sí se puede convertir a Boolean como False. Por último, hacemos la conversión a Boolean para asignarle el valor a la propiedad Checked del control CheckBox.


    Enrique Martínez Montejo
            [MS MVP - VB]

    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, 12 de enero de 2014 8:58
    Moderador
  • Mil Gracias por la respuesta Enrique.Claro y conciso,Excelente la explicación , la verdad me quedo sin palabras.En mi caso puntual esa columna dentro de la tabla siempre tendra un valor 0 o 1 ya que lo uso como bandera para ver si ese registro esta activo o inactivo ,luego en la programacion una fila de la tabla se convierte en una fila de un datagridview y por medio de una columna boton cambiar el valor por defecto que sera 1(true) por false (0) como me sugeris con esta linea,sin la condicion  

     cmd.Parameters.AddWithValue("@valor",0)

    Y aunque en este caso puntual no uso el checkbox para asignarle el valor,Es muy util saber como usarlo con lo que tiene en la base la columna bit,Habia leido algo al respecto pero no me habia quedado muy claro.

    Gracias de nuevo.

    Saludos.

    domingo, 12 de enero de 2014 17:05
  • Saludos disculpa yo tengo un problema ya solo me falta cargar o levantar el checkbox a la hora de dependiendo que dato tenga si tiene SI o NO solo que mi campo en la base de datos lo tengo como nvarchar estoy usando SQLSERVER, creo que solo me faltaria editar esta parte para que se cargue  me podrias ayudar a editarlo para hacer que cargue mi checkbox con un campo NVARCHAR???


    Dim value As Object = cmd.ExecuteScalar()
    
                If (value Is DBNull.Value) Then
                    value = Nothing
                End If
    
                CheckBox1.Checked = CBool(value)

    viernes, 17 de enero de 2014 23:36
  • "Aaron Rincon" preguntó:

    > yo tengo un problema ya solo me falta cargar o levantar el
    > checkbox a la hora de dependiendo que dato tenga si tiene
    > SI o NO solo que mi campo en la base de datos lo tengo
    > como nvarchar

    Te recomendé que ese campo fuera del tipo bit en lugar del tipo nvarchar, si solamente va a tener valores Verdadero (S, SI) o Falso (N, NO).

    Pero si sigues "empeñado" en que sea del tipo nvarchar (alfanumérico), al menos defínelo con el tipo de dato char(1), si solamente va a tener un carácter (S, N), o char(2) si va a tener dos caracteres (SI, NO).

    De todas maneras, sea del tipo nvarchar como del tipo char, lo cargarías de la siguiente manera:

       Dim value As Object = cmd.ExecuteScalar()
    
       If (value Is DBNull.Value) Then
           value = Nothing
       End If
    
       CheckBox1.Checked = If(Convert.ToString(value) = "S", True, False)

    Si el valor del campo tiene dos caracteres (SI, NO), entonces verificarías el valor de ésta manera:

        CheckBox1.Checked = If(Convert.ToString(value) = "SI", True, False)

    El inconveniente que tiene trabajar con tipos de datos nvarchar o char es que se distingue entre mayúsculas y minúsculas, por tanto, SI será diferente a Si, y N también será diferente de n, cuestión esta que no tendrías que preocuparte si el tipo de dato en la tabla de SQL Server fuera del tipo bit.

    En definitiva, tienes que verificar los valores de la misma manera que lo has insertado. Si a la hora de añadir el registro o modificarlo lo has hecho en mayúscula (SI, NO), tienes también que verificar el resultado en mayúscula, o bien, también puedes verificar los datos sin importar que estén en mayúscula o minúscula ejecutando:

        CheckBox1.Checked = If(Convert.ToString(value).ToUpperInvariant() = "SI", True, False)

    Fíjate todo lo que hay que tener en cuenta por tener el "capricho" de definir el tipo de dato como nvarchar o char, en lugar de tenerlo definido como bit, siempre y cuando ese campo actúe como un valor Boolean (S/N, Verdadero/Falso). ;-)


    Enrique Martínez Montejo
            [MS MVP - VB]

    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.



    sábado, 18 de enero de 2014 9:25
    Moderador
  • muchas gracias por tomarte el tiempo para responderme y aclararme esas dudas, solo quiero aclara que este no es un capricho, al menos no es un capricho mio estoy trabajando en un proyecto en el que entre cuando ya estaba avanzado el proyecto por eso mi duda era esta, una vez mas muchas gracias por tu apoyo y consejos y te garantizo que lo tendre muy ne cuenta y lo aplicare en futuros proyectos

    Saludos

    lunes, 20 de enero de 2014 3:25