none
Error: 'No se puede convertir un objeto DBNull en otros tipos.' RRS feed

  • Question

  • Saludos

    Estoy programando en webforms c#, usando SQL Server

    cuando intento buscar en la base de datos y viene con registros no tengo problema todo va bien,

    Pero cuando no encuentra registro me manda un null, dbnull p cero me manda el siguiente error a pantalla que dice: System.InvalidCastException: 'No se puede convertir un objeto DBNull en otros tipos.',

    el error me lo manda en esta linea: 

    decimal TotalCompras = Convert.ToDecimal(comando15.ExecuteScalar());

    Tengo este codigo:

    SqlParameter param75 = new SqlParameter("@Cov_Fecha", TxtFecha.Text);
    SqlParameter param76 = new SqlParameter("@Cov_Cajero", TxtCajero.Text);
    SqlParameter param77 = new SqlParameter("@Cov_Caja", DdlCaja.Text);
    SqlParameter param78 = new SqlParameter("@Cov_MonedaC", DdlMoneda.Text);
    SqlParameter param79 = new SqlParameter("@Cov_MonedaP", DdlMoneda.Text);
    SqlCommand comando15 = new SqlCommand("sp_Consulta_Cuadre6", con);
    comando15.Parameters.Add(param75);
    comando15.Parameters.Add(param76);
    comando15.Parameters.Add(param77);
    comando15.Parameters.Add(param78);
    comando15.Parameters.Add(param79);
    comando15.CommandType = CommandType.StoredProcedure;
    decimal TotalCompras = Convert.ToDecimal(comando15.ExecuteScalar());

    El Storeprocedure es el siguiente:

    USE [Divisas]
    GO
    /****** Object:  StoredProcedure [dbo].[sp_Consulta_Cuadre6]    Script Date: 19/7/2020 6:39:23 p.m. ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER proc [dbo].[sp_Consulta_Cuadre6] 
    
    @Cov_Fecha date = '', 
    @Cov_Caja varchar(50) = '',
    @Cov_Cajero varchar(30)= '',
    @Cov_MonedaP varchar(50) = '',
    @Cov_MonedaC varchar(50)= ''
    
    as
    begin
    
    ;WITH CTE
    aS
    
    (
    select SUM(Cov_CantidadP) As valor from CompraVenta where Cov_Fecha=@Cov_Fecha And Cov_Caja=@Cov_Caja and Cov_Cajero=@Cov_Cajero and Cov_MonedaP=@Cov_MonedaP and Cov_Transaccion='Compra' UNION ALL 
    
    select SUM(Cov_CantidadM) As valor from CompraVenta where Cov_Fecha=@Cov_Fecha And Cov_Caja=@Cov_Caja and Cov_Cajero=@Cov_Cajero and Cov_MonedaC=@Cov_MonedaC and Cov_Transaccion='Cambio' 
    )
    
    SELECT SUM(Valor)
    FROM CTE
    
    end 

    Todo funciona bien excepto cuando llega de la base de datos sin registro.

    Por favor ayudenme no soy esperto programando.

    Gracias

    Sunday, July 19, 2020 10:42 PM

Answers

  • hola

    Podrias validarlo, hay varias formas, podria ser

    var result = comando15.ExecuteScalar();
    
    if(result != DBNULL.Value){
    
        decimal TotalCompras = Convert.ToDecimal(result);
    
    }

    o podrias en la query que siempre retorne un valor usando

    SELECT ISNULL(SUM(Valor), 0) FROM CTE
    entonces sino hay registros que suma igual retorna un valor numerico

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marked as answer by agustin173 Monday, July 20, 2020 12:22 AM
    Sunday, July 19, 2020 11:56 PM

All replies

  • hola

    Podrias validarlo, hay varias formas, podria ser

    var result = comando15.ExecuteScalar();
    
    if(result != DBNULL.Value){
    
        decimal TotalCompras = Convert.ToDecimal(result);
    
    }

    o podrias en la query que siempre retorne un valor usando

    SELECT ISNULL(SUM(Valor), 0) FROM CTE
    entonces sino hay registros que suma igual retorna un valor numerico

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marked as answer by agustin173 Monday, July 20, 2020 12:22 AM
    Sunday, July 19, 2020 11:56 PM
  • Gracias Leandro muy amable me sirvio bastante te lo agradezco

    Gracias

    Dejare el codigo por si alguien lo necesita algun dia.

    decimal TotalCompras = 0;
                        SqlParameter param75 = new SqlParameter("@Cov_Fecha", TxtFecha.Text);
                        SqlParameter param76 = new SqlParameter("@Cov_Cajero", TxtCajero.Text);
                        SqlParameter param77 = new SqlParameter("@Cov_Caja", DdlCaja.Text);
                        SqlParameter param78 = new SqlParameter("@Cov_MonedaC", DdlMoneda.Text);
                        SqlParameter param79 = new SqlParameter("@Cov_MonedaP", DdlMoneda.Text);
                        SqlCommand comando15 = new SqlCommand("sp_Consulta_Cuadre6", con);
                        comando15.Parameters.Add(param75);
                        comando15.Parameters.Add(param76);
                        comando15.Parameters.Add(param77);
                        comando15.Parameters.Add(param78);
                        comando15.Parameters.Add(param79);
                        comando15.CommandType = CommandType.StoredProcedure;
                        var result = comando15.ExecuteScalar();
    
                        if (result != DBNull.Value)
                        {
    
                              TotalCompras = Convert.ToDecimal(result);
    
                        }

    Monday, July 20, 2020 12:24 AM
  • Hola agustin173, 

    Gracias por confirmar que se ha encontrado una solución a la consulta realizadaDebido a elloeste hilo será cerrado. 

    Si es necesario, por favor abra un nuevo hilo. 

    Cualquier duda referente a productos Microsoft, puedes consultarnos. Es un gusto informarte. 

    Gracias por usar los foros de MSDN. 

     

    Eric Ruiz

    ____________________________ 

      

    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.  

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.   

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. 

    Monday, July 20, 2020 2:49 PM
    Moderator