none
Como saber si un parametro de tipo BIT esta vacio ? RRS feed

  • Pregunta

  • Hola

    Tengo un procedimiento almacenado que recibe parametros de tipo BIT , este SP lo invoco desde una aplicacion C#,nesecito saber si el parametro  esta vacio  para insertar Null...

    Por ejemplo para parametros VarChar hago lo siguiente , (Nesecito algo asi para tipo BIT):

    	IF (LEN(@DivisionAdministrativa4)) = 0 BEGIN SET @DivisionAdministrativa4 = NULL; END


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    miércoles, 26 de septiembre de 2018 16:06

Respuestas

  • Hola Efrain:

    En sql no te hace falta hacerlo:

    USE foros;
    GO
    CREATE TABLE prueba1
    (id    INT IDENTITY(1, 1),
     valor VARCHAR(100),
     otro  BIT
    );
    GO
    CREATE PROCEDURE sp_insertaValor(@Sexo BIT)
    AS
         DECLARE @valorNulo BIT;
         INSERT INTO prueba1
    (valor,
     otro
    )
         VALUES
    ('a',
     @Sexo
    );
         RETURN;
    GO
    DECLARE @sexo TINYINT;
    EXEC sp_insertaValor
         @sexo;
    SET @Sexo = 0;
    EXEC sp_insertaValor
         @sexo;
    SET @Sexo = 1;
    EXEC sp_insertaValor
         @sexo;
    GO
    SELECT *
    FROM prueba1;
    

    Salida

    En c# puedes utilizar un Nulleable<byte>

                    var ConnectionString = @"Password=EcoMsde2012;Persist Security Info=True;User ID="
                       + @bdusuario + @";Initial Catalog=" + bdbasedatos + ";Data Source=" + bdservidor + ";";
    
                    SqlConnection connection = new SqlConnection(ConnectionString);
                    try
                    {
                        bool elValorDeLaVista = false;
                        /* si quiero un nulo, pongo un nulo, sino pongo 0 o 1 */
                        Nullable<System.Byte> sexo = null;
                        
                        connection.Open();
    
                        SqlCommand Query = new SqlCommand("sp_insertaValor", connection);
                        
                        Query.Parameters.Add("@Sexo", System.Data.SqlDbType.Bit).Value = DBNull.Value;
    
                        
                        Query.CommandType = CommandType.StoredProcedure;
                        Query.ExecuteNonQuery();
                        result = true;
                    }
                    catch { }

    Resultado :

    Un saludo

    jueves, 27 de septiembre de 2018 11:45

Todas las respuestas

  • Un campo tipo BIT, no puede estar vació, o bien es CERO o es UNO
    miércoles, 26 de septiembre de 2018 16:37
  • Hola Efrain Mejias Castillo:

    Si el parámetro es nulo, len devuelve null

    CREATE PROCEDURE sp_bit(@bit BIT)
    AS
         SELECT LEN(@bit);
         IF(LEN(@bit) IS NULL)
             SELECT 'el parametro recibido es nulo';
             ELSE
         SELECT 'el parametro recibido no es nulo, es:'+CAST(@bit AS VARCHAR);
         RETURN;
    GO
    DECLARE @bit BIT;
    EXEC sp_bit
         @bit;
    SET @bit = 1;
    EXEC sp_bit
         @bit;
    SET @bit = 0;
    EXEC sp_bit
         @bit;

    miércoles, 26 de septiembre de 2018 18:07
  • Hola.

    Según mi parecer, lo que deberías hacer seria que desde la aplicación obligues a enviar el dato que corresponda ya sea 0 o 1, o en caso contrario si es obligatorio enviar el valor Null desde C# puedes enviar DBNull.Value lo cual si el campo bit acepta valores nulos ya no haría falta realizar ninguna validación en el sp solo insertaría el valor que corresponda ya sea 0,1,Null

    Espero te sirva de ayuda.

    Saludos.

    miércoles, 26 de septiembre de 2018 19:20
  • Hola ,

    No e podido resolver mi problema  ... En mi aplicacion C# el campo es tipo bool y en la Db el campo es tipo bit

    siempre se inserta 0/1 pero nesecito poder insertar null cuando no tenga definido el valor en  mi aplicacion,

    intente con esta linea en mi SP pero inserta 0:

     IF (LEN(@VisitaALaCasa) IS NULL) BEGIN SET @VisitaALaCasa = NULL; END

    intente con esta linea desde C# pero me da error :

    Productor.Sexo = DbNull.Value;


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    jueves, 27 de septiembre de 2018 9:40
  • Hola Efrain:

    En sql no te hace falta hacerlo:

    USE foros;
    GO
    CREATE TABLE prueba1
    (id    INT IDENTITY(1, 1),
     valor VARCHAR(100),
     otro  BIT
    );
    GO
    CREATE PROCEDURE sp_insertaValor(@Sexo BIT)
    AS
         DECLARE @valorNulo BIT;
         INSERT INTO prueba1
    (valor,
     otro
    )
         VALUES
    ('a',
     @Sexo
    );
         RETURN;
    GO
    DECLARE @sexo TINYINT;
    EXEC sp_insertaValor
         @sexo;
    SET @Sexo = 0;
    EXEC sp_insertaValor
         @sexo;
    SET @Sexo = 1;
    EXEC sp_insertaValor
         @sexo;
    GO
    SELECT *
    FROM prueba1;
    

    Salida

    En c# puedes utilizar un Nulleable<byte>

                    var ConnectionString = @"Password=EcoMsde2012;Persist Security Info=True;User ID="
                       + @bdusuario + @";Initial Catalog=" + bdbasedatos + ";Data Source=" + bdservidor + ";";
    
                    SqlConnection connection = new SqlConnection(ConnectionString);
                    try
                    {
                        bool elValorDeLaVista = false;
                        /* si quiero un nulo, pongo un nulo, sino pongo 0 o 1 */
                        Nullable<System.Byte> sexo = null;
                        
                        connection.Open();
    
                        SqlCommand Query = new SqlCommand("sp_insertaValor", connection);
                        
                        Query.Parameters.Add("@Sexo", System.Data.SqlDbType.Bit).Value = DBNull.Value;
    
                        
                        Query.CommandType = CommandType.StoredProcedure;
                        Query.ExecuteNonQuery();
                        result = true;
                    }
                    catch { }

    Resultado :

    Un saludo

    jueves, 27 de septiembre de 2018 11:45